/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef SC_TABVWSH_HXX
#define SC_TABVWSH_HXX

#include <svtools/htmlcfg.hxx>
#include <sfx2/viewsh.hxx>
#include <sfx2/viewfac.hxx>
#include <editeng/svxenum.hxx>
#include "scdllapi.h"
#include "dbfunc.hxx"			// -> tabview
#include "target.hxx"
#include "rangelst.hxx"			// ScRangeListRef
#include "shellids.hxx"
#include "tabprotection.hxx" // for ScPasswordHash

class FmFormShell;
class SbxObject;
class SdrOle2Obj;
class SfxBindings;
class SfxChildWindow;
class SfxModelessDialog;
class SvxBorderLine;
class SvxBoxObjectRef;
class SvxNumberInfoItem;
struct SfxChildWinInfo;

class ScArea;
class ScAuditingShell;
class ScDrawShell;
class ScDrawTextObjectBar;
class ScEditShell;
class ScInputHandler;
class ScPivotShell;
class ScDrawFormShell;
class ScCellShell;
class ScOleObjectShell;
class ScGraphicShell;
class ScMediaShell;
class ScChartShell;
class ScPageBreakShell;
class ScDPObject;
class ScNavigatorSettings;

struct ScHeaderFieldData;

namespace com { namespace sun { namespace star { namespace frame {
	class XDispatchProviderInterceptor;
} } } }

namespace svx {
	class ExtrusionBar;
	class FontworkBar;
}

enum ObjectSelectionType
{
	OST_NONE,
	OST_Cell,
	OST_Editing,
	OST_DrawText,
	OST_Drawing,
	OST_DrawForm,
	OST_Pivot,
	OST_Auditing,
	OST_OleObject,
	OST_Chart,
	OST_Graphic,
	OST_Media
};

//==================================================================


class ScTabViewShell: public SfxViewShell, public ScDBFunc
{
private:
	static sal_uInt16			nInsertCtrlState;
	static sal_uInt16			nInsCellsCtrlState;
	static sal_uInt16			nInsObjCtrlState;

    SvxHtmlOptions          aHTMLOpt;
	ObjectSelectionType		eCurOST;
	sal_uInt16					nDrawSfxId;
	sal_uInt16					nCtrlSfxId;
	sal_uInt16					nFormSfxId;
    String                  sDrawCustom;                // current custom shape type
	ScDrawShell*			pDrawShell;
	ScDrawTextObjectBar*	pDrawTextShell;
	ScEditShell*			pEditShell;
	ScPivotShell*			pPivotShell;
	ScAuditingShell*		pAuditingShell;
	ScDrawFormShell*		pDrawFormShell;
	ScCellShell*			pCellShell;
	ScOleObjectShell*		pOleObjectShell;
	ScChartShell*			pChartShell;
	ScGraphicShell*			pGraphicShell;
	ScMediaShell*			pMediaShell;
	ScPageBreakShell*		pPageBreakShell;
	svx::ExtrusionBar*		pExtrusionBarShell;
	svx::FontworkBar*		pFontworkBarShell;

	FmFormShell*			pFormShell;

	ScInputHandler*			pInputHandler;				// fuer OLE-Eingabezeile

	SvxBorderLine*			pCurFrameLine;

	::com::sun::star::uno::Reference<
		::com::sun::star::frame::XDispatchProviderInterceptor >
							xDisProvInterceptor;

	Point					aWinPos;

	ScTabViewTarget			aTarget;
	ScArea*					pPivotSource;
	ScDPObject*				pDialogDPObject;

    ScNavigatorSettings*    pNavSettings;

    // used in first Activate
	sal_Bool					bFirstActivate;

	sal_Bool					bActiveDrawSh;
	sal_Bool					bActiveDrawTextSh;
	sal_Bool					bActivePivotSh;
	sal_Bool					bActiveAuditingSh;
	sal_Bool					bActiveDrawFormSh;
	sal_Bool					bActiveOleObjectSh;
	sal_Bool					bActiveChartSh;
	sal_Bool					bActiveGraphicSh;
	sal_Bool					bActiveMediaSh;
	sal_Bool					bActiveEditSh;

	sal_Bool                    bFormShellAtTop;            // does the FormShell need to be on top?


	sal_Bool					bDontSwitch;				// EditShell nicht abschalten
	sal_Bool					bInFormatDialog;			// fuer GetSelectionText
	sal_Bool					bPrintSelected;				// for result of SvxPrtQryBox

	sal_Bool					bReadOnly;					// um Status-Aenderungen zu erkennen
	sal_Bool 					bIsActive;
	SbxObject*				pScSbxObject;

//UNUSED2008-05  sal_Bool                    bChartDlgIsEdit;            // Datenbereich aendern
	sal_Bool					bChartAreaValid;			// wenn Chart aufgezogen wird
	String					aEditChartName;
	ScRangeListRef			aChartSource;
	Rectangle				aChartPos;
	SCTAB					nChartDestTab;
	sal_uInt16					nCurRefDlgId;

	SfxBroadcaster*			pAccessibilityBroadcaster;

	static const int		MASTERENUMCOMMANDS = 6;
    String					aCurrShapeEnumCommand[ MASTERENUMCOMMANDS ];

	sal_Bool	bForceFocusOnCurCell; // i123629
	sal_Bool	bSearchJustOpened; // i35093

private:
	void	Construct( sal_uInt8 nForceDesignMode = SC_FORCEMODE_NONE );

//UNUSED2008-05  void          SetMySubShell( SfxShell* pShell );
	SfxShell*		GetMySubShell() const;

	void			DoReadUserData( const String& rData );
    void          DoReadUserDataSequence( const ::com::sun::star::uno::Sequence<
                                     ::com::sun::star::beans::PropertyValue >& rSettings );

	DECL_LINK( SimpleRefClose, String* );
	DECL_LINK( SimpleRefDone, String* );
	DECL_LINK( SimpleRefAborted, String* );
	DECL_LINK( SimpleRefChange, String* );
    DECL_LINK( FormControlActivated, FmFormShell* );
	DECL_LINK( HtmlOptionsHdl, void * );

protected:
	virtual void	Activate(sal_Bool bMDI);
	virtual void	Deactivate(sal_Bool bMDI);
	virtual sal_uInt16	PrepareClose( sal_Bool bUI = sal_True, sal_Bool bForBrowsing = sal_False );

	virtual void	ShowCursor(FASTBOOL bOn);

	virtual void	Move();		// Benachrichtigung

	virtual void	AdjustPosSizePixel( const Point &rPos, const Size &rSize );		// alt

	virtual void	InnerResizePixel( const Point &rOfs, const Size &rSize );		// neu
	virtual void	OuterResizePixel( const Point &rOfs, const Size &rSize );
	virtual void	SetZoomFactor( const Fraction &rZoomX, const Fraction &rZoomY );

	virtual void	QueryObjAreaPixel( Rectangle& rRect ) const;

	virtual Size	GetOptimalSizePixel() const;

	virtual String  GetSelectionText( sal_Bool bWholeWord );
	virtual sal_Bool	HasSelection( sal_Bool bText ) const;
	virtual String  GetDescription() const;

	virtual void	WriteUserData(String &, sal_Bool bBrowse = sal_False);
	virtual void	ReadUserData(const String &, sal_Bool bBrowse = sal_False);
    virtual void    WriteUserDataSequence (::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse = sal_False );
    virtual void    ReadUserDataSequence (const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse = sal_False );

    virtual void    UIDeactivated( SfxInPlaceClient* pClient );

	virtual FASTBOOL KeyInput( const KeyEvent &rKeyEvent );
	virtual SdrView* GetDrawView() const;

public:
					TYPEINFO_VISIBILITY(SC_DLLPUBLIC);

					SFX_DECL_INTERFACE(SCID_TABVIEW_SHELL)
					SFX_DECL_VIEWFACTORY(ScTabViewShell);


					// -> Clone-Methode fuer Factory

//UNUSED2008-05  ScTabViewShell( SfxViewFrame*           pViewFrame,
//UNUSED2008-05                  const ScTabViewShell&   rWin );

					// aus einer allgemeinen Shell konstruieren und
					// soviel wie moeglich uebernehmen (SliderPos etc.):

					ScTabViewShell( SfxViewFrame*			pViewFrame,
									SfxViewShell*			pOldSh );

	virtual			~ScTabViewShell();

	Window*			GetDialogParent();

    bool            IsRefInputMode() const;
	void			ExecuteInputDirect();

	ScInputHandler*	GetInputHandler() const;
	void			UpdateInputHandler( sal_Bool bForce = sal_False, sal_Bool bStopEditing = sal_True );
    void            UpdateInputHandlerCellAdjust( SvxCellHorJustify eJust );
	sal_Bool			TabKeyInput(const KeyEvent& rKEvt);
	sal_Bool			SfxKeyInput(const KeyEvent& rKEvt);

	void			SetActive();

	SvxBorderLine*	GetDefaultFrameLine() const { return pCurFrameLine; }
	void 			SetDefaultFrameLine(const SvxBorderLine* pLine );

//UNUSED2008-05  void            ExecuteShowNIY( SfxRequest& rReq );
//UNUSED2008-05  void			StateDisabled( SfxItemSet& rSet );

	SC_DLLPUBLIC void			Execute( SfxRequest& rReq );
	SC_DLLPUBLIC void			GetState( SfxItemSet& rSet );

	void			ExecuteTable( SfxRequest& rReq );
	void			GetStateTable( SfxItemSet& rSet );

	void			WindowChanged();
	void 			ExecDraw(SfxRequest&);
	void			ExecDrawIns(SfxRequest& rReq);
	void 			GetDrawState(SfxItemSet &rSet);
	void 			GetDrawInsState(SfxItemSet &rSet);
	void			ExecGallery(SfxRequest& rReq);		// StarGallery
	void			GetGalleryState(SfxItemSet& rSet);

	void			ExecChildWin(SfxRequest& rReq);
	void			GetChildWinState( SfxItemSet& rSet );

	void			ExecImageMap( SfxRequest& rReq );
	void			GetImageMapState( SfxItemSet& rSet );

	void			ExecTbx( SfxRequest& rReq );
	void			GetTbxState( SfxItemSet& rSet );

	void			ExecuteSave( SfxRequest& rReq );
	void			GetSaveState( SfxItemSet& rSet );
	void			ExecSearch( SfxRequest& rReq );

	void			ExecuteUndo(SfxRequest& rReq);
	void			GetUndoState(SfxItemSet &rSet);

	void			ExecuteSbx( SfxRequest& rReq );
	void			GetSbxState( SfxItemSet& rSet );

	void			ExecuteObject(SfxRequest& rReq);
	void			GetObjectState(SfxItemSet &rSet);

	void			ExecDrawOpt(SfxRequest& rReq);
	void			GetDrawOptState(SfxItemSet &rSet);

    void            UpdateDrawShell();
	void			SetDrawShell( sal_Bool bActive );
	void			SetDrawTextShell( sal_Bool bActive );

	void			SetPivotShell( sal_Bool bActive );
	ScArea*			GetPivotSource(){return pPivotSource;}
	void			SetPivotSource(ScArea* pSrc){pPivotSource=pSrc;}
	void			SetDialogDPObject( const ScDPObject* pObj );
	const ScDPObject* GetDialogDPObject() const { return pDialogDPObject; }

	sal_Bool			GetDontSwitch(){return bDontSwitch;}
	void			SetDontSwitch(sal_Bool bFlag){bDontSwitch=bFlag;}


	void			SetAuditShell( sal_Bool bActive );
	void			SetDrawFormShell( sal_Bool bActive );
	void			SetEditShell(EditView* pView, sal_Bool bActive );
	void			SetOleObjectShell( sal_Bool bActive );
	void			SetChartShell( sal_Bool bActive );
	void			SetGraphicShell( sal_Bool bActive );
	void			SetMediaShell( sal_Bool bActive );


	void			SetDrawShellOrSub();
	void			SetCurSubShell( ObjectSelectionType eOST, sal_Bool bForce = sal_False );

    void            SetFormShellAtTop( sal_Bool bSet );

	ObjectSelectionType GetCurObjectSelectionType();

	virtual ErrCode	DoVerb(long nVerb);


	void			StopEditShell();
	sal_Bool			IsDrawTextShell() const;
	sal_Bool			IsAuditShell() const;

	void			SetDrawTextUndo( ::svl::IUndoManager* pUndoMgr );

	void			FillFieldData( ScHeaderFieldData& rData );

//UNUSED2008-05  void            ResetChartArea();
	void			SetChartArea( const ScRangeListRef& rSource, const Rectangle& rDest );
	sal_Bool			GetChartArea( ScRangeListRef& rSource, Rectangle& rDest, SCTAB& rTab ) const;

//UNUSED2008-05  sal_Bool            IsChartDlgEdit() const;
//UNUSED2008-05  void            SetChartDlgEdit(sal_Bool bFlag){bChartDlgIsEdit=bFlag;}

	void			SetEditChartName(const String& aStr){aEditChartName=aStr;}
//UNUSED2008-05  const String&   GetEditChartName() const;

	virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    ScNavigatorSettings*    GetNavigatorSettings();

	// Drucken:
	virtual SfxPrinter*		GetPrinter( sal_Bool bCreate = sal_False );
	virtual sal_uInt16			SetPrinter( SfxPrinter* pNewPrinter,
                                          sal_uInt16 nDiffFlags = SFX_PRINTER_ALL, bool bIsApi=false );

	virtual SfxTabPage*     CreatePrintOptionsPage( Window *pParent, const SfxItemSet &rOptions );

	void			ConnectObject( SdrOle2Obj* pObj );
	sal_Bool			ActivateObject( SdrOle2Obj* pObj, long nVerb );

    void            DeactivateOle();

	SC_DLLPUBLIC static ScTabViewShell* GetActiveViewShell();
	SfxModelessDialog*	CreateRefDialog( SfxBindings* pB, SfxChildWindow* pCW,
										SfxChildWinInfo* pInfo,
										Window* pParent, sal_uInt16 nSlotId );

	void			UpdateOleZoom();
	inline SbxObject* GetScSbxObject() const
					{ return pScSbxObject; }
	inline void		SetScSbxObject( SbxObject* pOb )
					{ pScSbxObject = pOb; }

	FmFormShell*	GetFormShell() const	{ return pFormShell; }

	void 	InsertURL( const String& rName, const String& rURL, const String& rTarget,
							sal_uInt16 nMode );
	void 	InsertURLButton( const String& rName, const String& rURL, const String& rTarget,
							const Point* pInsPos = NULL );
	void 	InsertURLField( const String& rName, const String& rURL, const String& rTarget );

	sal_Bool	SelectObject( const String& rName );

	void	SetInFormatDialog(sal_Bool bFlag) {bInFormatDialog=bFlag;}
	sal_Bool    IsInFormatDialog() {return bInFormatDialog;}

	void	ForceMove()		{ Move(); }

	void 	MakeNumberInfoItem		( ScDocument*			 pDoc,
									  ScViewData*			 pViewData,
									  SvxNumberInfoItem**	 ppItem );

	void 	UpdateNumberFormatter	( ScDocument*		     	pDoc,
									  const SvxNumberInfoItem& 	rInfoItem );

	void	ExecuteCellFormatDlg	( SfxRequest& rReq, sal_uInt16 nTabPage = 0xffff );

	sal_Bool	GetFunction( String& rFuncStr, sal_uInt16 nErrCode = 0 );

	void	StartSimpleRefDialog( const String& rTitle, const String& rInitVal,
                                    sal_Bool bCloseOnButtonUp, sal_Bool bSingleCell, sal_Bool bMultiSelection );
	void	StopSimpleRefDialog();

	void	SetCurRefDlgId( sal_uInt16 nNew );

	void	AddAccessibilityObject( SfxListener& rObject );
	void	RemoveAccessibilityObject( SfxListener& rObject );
	void	BroadcastAccessibility( const SfxHint &rHint );
	sal_Bool	HasAccessibilityObjects();

    bool    ExecuteRetypePassDlg(ScPasswordHash eDesiredHash);

    using ScTabView::ShowCursor;
	sal_Bool IsActive(){ return bIsActive; }
	rtl::OUString GetFormula(ScAddress& rAddress);
	const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & GetForms() const;

	// i123629
	sal_Bool	GetForceFocusOnCurCell(){return bForceFocusOnCurCell;}
	void		SetForceFocusOnCurCell(sal_Bool bFlag){bForceFocusOnCurCell=bFlag;}
};

//==================================================================


#endif

