/**************************************************************
 * 
 * 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 _EDTWIN_HXX
#define _EDTWIN_HXX

#include <svx/svdobj.hxx>
#include <tools/link.hxx>
#include <vcl/timer.hxx>
#include <vcl/window.hxx>
#include <svtools/transfer.hxx>
#include <swevent.hxx>

#define _SVSTDARR_STRINGSISORTDTOR
#include <svl/svstdarr.hxx>

class	SwWrtShell;
class 	SwView;
class 	SwRect;
class	ViewShell;
class	SwAnchorMarker;
class	SdrObject;
class	SwShadowCursor;
class	DataChangedEvent;
class   SvxAutoCorrCfg;
class   SvxAutoCorrect;
class   SwPaM;
struct	SwApplyTemplate;
struct 	QuickHelpData;
class SdrDropMarkerOverlay;

/*--------------------------------------------------------------------
	Beschreibung:	Eingabe-Fenster
 --------------------------------------------------------------------*/

class SwEditWin: public Window,
				public DropTargetHelper, public DragSourceHelper
{
friend void 	ScrollMDI(ViewShell* pVwSh, const SwRect&,
						  sal_uInt16 nRangeX, sal_uInt16 nRangeY);
friend sal_Bool 	IsScrollMDI(ViewShell* pVwSh, const SwRect&);

friend void 	SizeNotify(ViewShell* pVwSh, const Size &);

friend void 	PageNumNotify( 	ViewShell* pVwSh,
								sal_uInt16 nPhyNum,
								sal_uInt16 nVirtNum,
								const String& rPg );

	static  QuickHelpData* pQuickHlpData;

	static	sal_Bool	bReplaceQuote;
	static	long 	nDDStartPosX, nDDStartPosY;

	static 	Color	aTextColor; 	//Textfarbe, fuer die Giesskanne
	static 	sal_Bool	bTransparentBackColor; // Hintergrund transparent
	static 	Color	aTextBackColor; //Texthintergrundfarbe, fuer die Giesskanne

	/*
	 * Timer und Handler fuer das Weiterscrollen, wenn der
	 * Mauspointer innerhalb eines Drag-Vorgangs ausserhalb des
	 * EditWin stehen bleibt.  In regelmaessigen Intervallen wird
	 * die Selektion in Richtung der Mausposition vergroessert.
	 */
	AutoTimer 		aTimer;
	// Timer fuer verschachtelte KeyInputs (z.B. fuer Tabellen)
	Timer 			aKeyInputTimer;
	// timer for ANY-KeyInut question without a following KeyInputEvent
	Timer 			aKeyInputFlushTimer;

	String			aInBuffer;
    LanguageType    eBufferLanguage;
	Point			aStartPos;
	Point			aMovePos;
	Point			aRszMvHdlPt;
	Timer 			aTemplateTimer;

	// Type/Objecte ueber dem der MousePointer steht
	SwCallMouseEvent aSaveCallEvent;

	SwApplyTemplate 	*pApplyTempl;
	SwAnchorMarker		*pAnchorMarker; // zum Verschieben eines Ankers

	SdrDropMarkerOverlay	*pUserMarker;
	SdrObject				*pUserMarkerObj;
	SwShadowCursor			*pShadCrsr;
    Point					*pRowColumnSelectionStart; // save position where table row/column selection has been started

	SwView		   &rView;

	int		 		aActHitType;	// aktueller Mauspointer

    sal_uLong           m_nDropFormat;   //Format aus dem letzten QueryDrop
    sal_uInt16          m_nDropAction;   //Action aus dem letzten QueryDrop
    sal_uInt16          m_nDropDestination;  //Ziel aus dem letzten QueryDrop

	sal_uInt16			eBezierMode;
	sal_uInt16			nInsFrmColCount; //Spaltenzahl fuer interaktiven Rahmen
	SdrObjKind		eDrawMode;
	sal_Bool			bLinkRemoved	: 1,
					bMBPressed		: 1,
					bInsDraw 		: 1,
					bInsFrm 		: 1,
					bIsInMove		: 1,
					bIsInDrag		: 1, //StartExecuteDrag nich doppelt ausfuehren
					bOldIdle		: 1, //Zum abschalten des Idle'ns
					bOldIdleSet		: 1, //waehrend QeueryDrop
					bTblInsDelMode	: 1, //
					bTblIsInsMode	: 1, //
					bTblIsColMode	: 1, //
					bChainMode		: 1, //Rahmen verbinden
					bWasShdwCrsr	: 1, //ShadowCrsr war im MouseButtonDown an
                    bLockInput      : 1, //Lock waehrend die Rechenleiste aktiv ist
                    bIsRowDrag      : 1, //selection of rows is used, in combination with pRowColumnSelectionStart
                    /** #i42732# display status of font size/name depending on either the input language or the
                        selection position depending on what has changed lately
                     */
                    bUseInputLanguage: 1,
					bObjectSelect	: 1;


    sal_uInt16          nKS_NUMDOWN_Count; // #i23725#
    sal_uInt16          nKS_NUMINDENTINC_Count;

	void			LeaveArea(const Point &);
	void			JustifyAreaTimer();
	inline void		EnterArea();

	void			RstMBDownFlags();

	void			ChangeFly( sal_uInt8 nDir, sal_Bool bWeb = sal_False );
    void            ChangeDrawing( sal_uInt8 nDir );

	sal_Bool			EnterDrawMode(const MouseEvent& rMEvt, const Point& aDocPos);
    sal_Bool            RulerColumnDrag( const MouseEvent& rMEvt, sal_Bool bVerticalMode);

	//Hilfsfunktionen fuer D&D
	void			DropCleanup();
	void			CleanupDropUserMarker();
	sal_uInt16			GetDropDestination( const Point& rPixPnt,
										SdrObject ** ppObj = 0 );
    //select the object/cursor at the mouse position of the context menu request
    sal_Bool            SelectMenuPosition(SwWrtShell& rSh, const Point& rMousePos );

	/*
	 * Handler fuer das Weiterscrollen, wenn der Mauspointer innerhalb eines
	 * Drag-Vorgangs ausserhalb des EditWin stehen bleibt. In regelmaessigen
	 * Intervallen wird die Selektion in Richtung der Mausposition
	 * vergroessert.
	 */
	DECL_LINK( TimerHandler, Timer * );
	void			StartDDTimer();
	void			StopDDTimer(SwWrtShell *, const Point &);
	DECL_LINK( DDHandler, Timer * );

	// timer for ANY-KeyInut question without a following KeyInputEvent
	DECL_LINK( KeyInputFlushHandler, Timer * );

	// Timer fuer verschachtelte KeyInputs (z.B. fuer Tabellen)
	DECL_LINK( KeyInputTimerHandler, Timer * );

	// Timer fuer das ApplyTemplates per Maus (verkapptes Drag&Drop)
	DECL_LINK( TemplateTimerHdl, Timer* );

    using OutputDevice::GetTextColor;

protected:

	virtual void	DataChanged( const DataChangedEvent& );
	virtual void	PrePaint();
	virtual void	Paint( const Rectangle& rRect );
	virtual void 	KeyInput(const KeyEvent &rKEvt);

	virtual void 	GetFocus();
	virtual void 	LoseFocus();


	virtual void 	MouseMove(const MouseEvent& rMEvt);
	virtual void 	MouseButtonDown(const MouseEvent& rMEvt);
	virtual void 	MouseButtonUp(const MouseEvent& rMEvt);
	virtual void	RequestHelp(const HelpEvent& rEvt);

	virtual void	Command( const CommandEvent& rCEvt );

								// Drag & Drop Interface
	virtual sal_Int8 	AcceptDrop( const AcceptDropEvent& rEvt );
	virtual sal_Int8 	ExecuteDrop( const ExecuteDropEvent& rEvt );
	virtual void		StartDrag( sal_Int8 nAction, const Point& rPosPixel );

    virtual XubString GetSurroundingText() const;
    virtual Selection GetSurroundingTextSelection() const;
    
    void    ShowAutoTextCorrectQuickHelp( const String& rWord, SvxAutoCorrCfg* pACfg,
                                SvxAutoCorrect* pACorr, sal_Bool bFromIME = sal_False );
public:

	void			UpdatePointer(const Point &, sal_uInt16 nButtons = 0);

	sal_Bool			IsDrawSelMode();
	sal_Bool			IsDrawAction() 					{ return (bInsDraw); }
	void			SetDrawAction(sal_Bool bFlag) 		{ bInsDraw = bFlag; }

	void			SetObjectSelect( sal_Bool bVal )	{ bObjectSelect = bVal; }
	sal_Bool			IsObjectSelect() const			{ return bObjectSelect; }

	inline SdrObjKind	GetSdrDrawMode(/*sal_Bool bBuf = sal_False*/) const { return eDrawMode; }
	inline void			SetSdrDrawMode( SdrObjKind eSdrObjectKind )	{ eDrawMode = eSdrObjectKind; SetObjectSelect( sal_False ); }
	void				StdDrawMode( SdrObjKind eSdrObjectKind, sal_Bool bObjSelect );

	sal_Bool			IsFrmAction() 					{ return (bInsFrm); }
	inline sal_uInt16	GetBezierMode() 				{ return eBezierMode; }
	void			SetBezierMode(sal_uInt16 eBezMode)	{ eBezierMode = eBezMode; }
	void			EnterDrawTextMode(const Point& aDocPos); // DrawTextEditMode einschalten
	void			InsFrm(sal_uInt16 nCols);
	void 			StopInsFrm();
	sal_uInt16			GetFrmColCount() const {return nInsFrmColCount;} //Spaltenzahl fuer interaktiven Rahmen


	void			SetChainMode( sal_Bool bOn );
	sal_Bool			IsChainMode() const				{ return bChainMode; }

    void            FlushInBuffer();
    sal_Bool            IsInputSequenceCheckingRequired( const String &rText, const SwPaM& rCrsr ) const;


	static	void 	SetReplaceQuote(sal_Bool bOn = sal_True) { bReplaceQuote = bOn; }
	static	sal_Bool 	IsReplaceQuote() { return bReplaceQuote; }

	void 			 SetApplyTemplate(const SwApplyTemplate &);
	SwApplyTemplate* GetApplyTemplate() const { return pApplyTempl; }

	void			StartExecuteDrag();
	void			DragFinished();
    sal_uInt16          GetDropAction() const { return m_nDropAction; }
    sal_uLong           GetDropFormat() const { return m_nDropFormat; }

	Color 			GetTextColor() { return aTextColor; }

	void 			SetTextColor(const Color& rCol ) { aTextColor = rCol; }

	Color 			GetTextBackColor()
											{ return aTextBackColor; }
	void 			SetTextBackColor(const Color& rCol )
											{ aTextBackColor = rCol; }
	void			SetTextBackColorTransparent(sal_Bool bSet)
									{ bTransparentBackColor = bSet; }
	sal_Bool			IsTextBackColorTransparent()
									{ return bTransparentBackColor; }
	void			LockKeyInput(sal_Bool bSet){bLockInput = bSet;}

	const SwView &GetView() const { return rView; }
		  SwView &GetView() 	  { return rView; }

    virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();

	// Tipfenster loeschen
	static void ClearTip();

	static inline long GetDDStartPosX() { return nDDStartPosX; }
	static inline long GetDDStartPosY() { return nDDStartPosY; }

	static void	_InitStaticData();
	static void	_FinitStaticData();

    //#i3370# remove quick help to prevent saving of autocorrection suggestions
    void StopQuickHelp();

    // --> OD 2005-02-18 #i42921# - add parameter <bVerticalMode>
    sal_Bool RulerMarginDrag( const MouseEvent& rMEvt,
                                     const bool bVerticalMode );
    // <--

    /** #i42732# display status of font size/name depending on either the input
        language or the selection position depending on what has changed lately
     */
    void        SetUseInputLanguage( sal_Bool bNew );
    sal_Bool    IsUseInputLanguage() const { return bUseInputLanguage; }

    SwEditWin(Window *pParent, SwView &);
	virtual ~SwEditWin();
	virtual void SwitchView();
};

#endif