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

#include <com/sun/star/text/RelOrientation.hpp>
#include <com/sun/star/embed/XClassifiedObject.hpp>
#include <com/sun/star/embed/XEmbeddedObject.hpp>

#include <svx/svdobj.hxx>
#include "swdllapi.h"
#include <editsh.hxx>
#include <flyenum.hxx>

// OD 25.06.2003 #108784#
#include <svx/svdtypes.hxx>

#include <svtools/embedhlp.hxx>

#ifndef INCLUDED_VECTOR
#include <vector>
#define INCLUDED_VECTOR
#endif


class SwFlyFrm;
class SwTabCols;
class SvxBrushItem;
class SvxFrameDirectionItem;
class SwTableAutoFmt;
class SwFrm;
class SwFmtFrmSize;
class SwFmtRowSplit;
class SvxBorderLine;
class SdrObject;
class Color;
class Outliner;
class SotDataObject;
class SwFrmFmt;
struct SwSortOptions;
class SdrMarkList;

namespace svx
{
    class ISdrObjectFilter;
}


// return values for GetFrmType() und GetSelFrmType().
//! values can be combined via logival or
#define FRMTYPE_NONE			(sal_uInt16)     0
#define FRMTYPE_PAGE			(sal_uInt16)     1
#define FRMTYPE_HEADER			(sal_uInt16)     2
#define FRMTYPE_FOOTER			(sal_uInt16)     4
#define FRMTYPE_BODY			(sal_uInt16)     8
#define FRMTYPE_COLUMN			(sal_uInt16)    16
#define FRMTYPE_TABLE			(sal_uInt16)    32
#define FRMTYPE_FLY_FREE		(sal_uInt16)    64
#define FRMTYPE_FLY_ATCNT		(sal_uInt16)   128
#define FRMTYPE_FLY_INCNT		(sal_uInt16)   256
#define FRMTYPE_FOOTNOTE		(sal_uInt16)   512
#define FRMTYPE_FTNPAGE			(sal_uInt16)  1024
#define FRMTYPE_FLY_ANY			(sal_uInt16)  2048
#define FRMTYPE_DRAWOBJ			(sal_uInt16)  4096
#define FRMTYPE_COLSECT			(sal_uInt16)  8192
#define FRMTYPE_COLSECTOUTTAB 	(sal_uInt16) 16384

#define FRMTYPE_ANYCOLSECT ( FRMTYPE_COLSECT | FRMTYPE_COLSECTOUTTAB )

//! values can be combined via logival or
#define GOTOOBJ_DRAW_CONTROL 	(sal_uInt16)  1
#define GOTOOBJ_DRAW_SIMPLE 	(sal_uInt16)  2
#define GOTOOBJ_DRAW_ANY 		(sal_uInt16)  3
#define GOTOOBJ_FLY_FRM 		(sal_uInt16)  4
#define GOTOOBJ_FLY_GRF 		(sal_uInt16)  8
#define GOTOOBJ_FLY_OLE 		(sal_uInt16) 16
#define GOTOOBJ_FLY_ANY 		(sal_uInt16) 28
#define GOTOOBJ_GOTO_ANY 		(sal_uInt16) 31

//! values can be combined via logival or
#define FLYPROTECT_CONTENT		(sal_uInt16)  1		// kann verodert werden!
#define FLYPROTECT_SIZE			(sal_uInt16)  2
#define FLYPROTECT_POS			(sal_uInt16)  4
#define FLYPROTECT_PARENT 		(sal_uInt16)  8 	// nur Parents untersuchen
#define FLYPROTECT_FIXED		(sal_uInt16) 16		// nur nicht aufhebbarer Schutz
												// z.B. durch OLE-Server, gilt auch
												// fuer Dialog


enum ObjCntType		//Fuer das Ermitteln des Cntnts per Positon (D&D)
{
	OBJCNT_NONE,
	OBJCNT_FLY,
	OBJCNT_GRF,
	OBJCNT_OLE,
	OBJCNT_SIMPLE,
	OBJCNT_CONTROL,
	OBJCNT_URLBUTTON,

	OBJCNT_GROUPOBJ,
	OBJCNT_DONTCARE		// nicht bestimmbar - unterschiedliche Objecte selektiert
};

//fuer GetAnyCurRect
enum CurRectType
{
	RECT_PAGE,					//Rect der aktuellen Seite.
	RECT_PAGE_CALC,				//... Seite wird ggf. Formatiert
	RECT_PAGE_PRT,              //Rect der aktuellen PrtArea der Seite
	RECT_FRM,                   //Rect des aktuellen Rahmen
	RECT_FLY_EMBEDDED,          //Rect des aktuellen FlyFrm
	RECT_FLY_PRT_EMBEDDED,      //Rect der PrtArea des FlyFrm
	RECT_SECTION,				//Rect des aktuellen Bereichs
	RECT_OUTTABSECTION,			//Rect des aktuellen Bereichs,
								// aber ausserhalb der Tabelle
	RECT_SECTION_PRT,  			//Rect der aktuellen PrtArea des Bereichs
	RECT_OUTTABSECTION_PRT, 	//Rect der aktuellen PrtArea des Bereichs,
								// aber ausserhalb der Tabelle
	RECT_HEADERFOOTER,     		//Rect des aktuellen Headers/Footer
    RECT_HEADERFOOTER_PRT,      //Rect der PrtArea des aktuellen Headers/Footers

    RECT_PAGES_AREA             //Rect covering the pages area
};

struct SwGetCurColNumPara
{
	const SwFrmFmt* pFrmFmt;
	const SwRect* pPrtRect, *pFrmRect;
	SwGetCurColNumPara() : pFrmFmt( 0 ), pPrtRect( 0 ), pFrmRect( 0 ) {}
};

#define SW_PASTESDR_INSERT		1
#define SW_PASTESDR_REPLACE		2
#define SW_PASTESDR_SETATTR		3

#define SW_ADD_SELECT   1
#define SW_ENTER_GROUP  2
#define SW_LEAVE_FRAME  4

#define SW_MOVE_UP      0
#define SW_MOVE_DOWN    1
#define SW_MOVE_LEFT    2
#define SW_MOVE_RIGHT   3

#define SW_TABCOL_NONE          0
#define SW_TABCOL_HORI          1
#define SW_TABCOL_VERT          2
#define SW_TABROW_HORI          3
#define SW_TABROW_VERT          4
// --> FME 2004-07-30 #i32329# Enhanced table selection
#define SW_TABSEL_HORI          5
#define SW_TABSEL_HORI_RTL      6
#define SW_TABROWSEL_HORI       7
#define SW_TABROWSEL_HORI_RTL   8
#define SW_TABCOLSEL_HORI       9
#define SW_TABSEL_VERT          10
#define SW_TABROWSEL_VERT       11
#define SW_TABCOLSEL_VERT       12
// <--

class SdrDropMarkerOverlay;

class SW_DLLPUBLIC SwFEShell : public SwEditShell
{
	SdrDropMarkerOverlay *pChainFrom, *pChainTo;
	sal_Bool bCheckForOLEInCaption;

	SW_DLLPRIVATE SwFlyFrm *FindFlyFrm() const;
    SW_DLLPRIVATE SwFlyFrm *FindFlyFrm( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >&  ) const;

	//Actions fuer alle Shells beenden und ChangeLink rufen.
	SW_DLLPRIVATE void EndAllActionAndCall();

	SW_DLLPRIVATE void ScrollTo( const Point &rPt );

    // OD 25.06.2003 #108784# - correct type of 1st parameter
    SW_DLLPRIVATE void ChangeOpaque( SdrLayerID nLayerId );

    // Used for mouse operations on a table:
    // Returns a cell frame that is 'close' to rPt.
    SW_DLLPRIVATE const SwFrm *GetBox( const Point &rPt, bool* pbRow = 0, bool* pbCol = 0 ) const;

	//0 == in keiner Spalte
	SW_DLLPRIVATE sal_uInt16 _GetCurColNum( const SwFrm *pFrm,
						  SwGetCurColNumPara* pPara ) const;

    SW_DLLPRIVATE void _GetTabCols( SwTabCols &rToFill, const SwFrm *pBox ) const;
    SW_DLLPRIVATE void _GetTabRows( SwTabCols &rToFill, const SwFrm *pBox ) const;

	SW_DLLPRIVATE sal_Bool ImpEndCreate();

	SW_DLLPRIVATE ObjCntType GetObjCntType( const SdrObject& rObj ) const;

	// Methoden fuers kopieren von DrawObjecten
	SW_DLLPRIVATE sal_Bool CopyDrawSel( SwFEShell* pDestShell, const Point& rSttPt,
								const Point& rInsPt, sal_Bool bIsMove,
								sal_Bool bSelectInsert );

    // get list of marked SdrObjects;
    // helper method for GetSelFrmType, IsSelContainsControl
    SW_DLLPRIVATE const SdrMarkList* _GetMarkList() const;

    SW_DLLPRIVATE sal_Bool CheckHeadline( bool bRepeat ) const;

    using SwEditShell::Copy;

public:

    using SwEditShell::Insert;

	TYPEINFO();
    SwFEShell( SwDoc& rDoc, Window *pWin, const SwViewOption *pOpt = 0 );
	SwFEShell( SwEditShell& rShell, Window *pWin );
	virtual ~SwFEShell();

	// Copy und Paste Methoden fuer das interne Clipboard
	sal_Bool Copy( SwDoc* pClpDoc, const String* pNewClpTxt = 0 );
    sal_Bool Paste( SwDoc* pClpDoc, sal_Bool bIncludingPageFrames = sal_False);
    //paste some pages into another doc - used in mailmerge
    sal_Bool PastePages( SwFEShell& rToFill, sal_uInt16 nStartPage, sal_uInt16 nEndPage);
	// Copy-Methode fuer Drag&Drop
	sal_Bool Copy( SwFEShell*, const Point& rSttPt, const Point& rInsPt,
				sal_Bool bIsMove = sal_False, sal_Bool bSelectInsert = sal_True );

	void SelectFlyFrm( SwFlyFrm& rFrm, sal_Bool bNew = sal_False );

	// befindet sich der selektierte Rahmen innerhalb eines anderen?
	const SwFrmFmt* IsFlyInFly();

//SS fuer DrawObjekte und Rahmen-----------------------------

	//Wenn ein Objekt angegeben wurde, so wird genau diese Markiert (anstatt
	//ueber die Position zu suchen.
    sal_Bool SelectObj( const Point& rSelPt, sal_uInt8 nFlag = 0, SdrObject *pObj = 0 );
	void DelSelectedObj();

	//Selektion nach oben unten bewegen (Z-Order).
	//sal_True	== ganz nach oben/unten
	//sal_False == einen ueberholen
	void SelectionToTop   ( sal_Bool bTop = sal_True );
	void SelectionToBottom( sal_Bool bBottom = sal_True );

	short GetLayerId() const;	//1 Heaven, 0 Hell, -1 Uneindeutig
	void  SelectionToHeaven();	//Ueber dem Dokument
	void  SelectionToHell();	//Unter dem Dokument

	// folgende zwei Methoden returnen den enum SdrHdlKind, um sich ein
	// includen von SVDRAW.HXX zu ersparen als int deklariert.
    bool IsObjSelectable( const Point& rPt );
    int IsInsideSelectedObj( const Point& rPt );    //!! returns enum values

	// #107513#
	// Test if there is a draw object at that position and if it should be selected.
	// The 'should' is aimed at Writer text fly frames which may be in front of
	// the draw object.
	sal_Bool ShouldObjectBeSelected(const Point& rPt);

    sal_Bool MoveAnchor( sal_uInt16 nDir );

    // Returns if Upper of frame at current position is section frame
    // Currently only used by the rules. To be replaced by something more
    // sophisticated one day.
    bool IsDirectlyInSection() const;

	//Returnwerte siehe oben FrmType.
	//pPt: Crsr bzw. DocPos; bStopAtFly: Bei Flys anhalten oder ueber den Anchor weitergehen
	// Obgleich (0,sal_True) eine Art Standard ist, sind die Parameter nicht defaultet, damit
	// bei jeder Benutzung insbesondere das bStopAtFly bewusst genutzt wird.
	sal_uInt16 GetFrmType( const Point *pPt, sal_Bool bStopAtFly ) const;
	sal_uInt16 GetSelFrmType() const;				//Selektion (Drawing)

    /** #108784# check whether selected frame contains a control;
     * companion method to GetSelFrmType, used for preventing
     * drag&drop of controls into header */
    bool IsSelContainsControl() const;

	ObjCntType GetObjCntType( const Point &rPt, SdrObject *&rpObj ) const;
	ObjCntType GetObjCntTypeOfSelection( SdrObject** ppObj = 0 ) const;

	//Zum Anpassen der PosAttr bei Ankerwechseln.
	SwRect  GetObjRect() const;
	//Zum Verschieben von Flys mit der Tastatur
	SwRect  GetFlyRect() const;
    // OD 18.09.2003 #i17567#, #108749#, #110354# - adjustments to allow
    //          negative vertical positions for fly frames anchored
    //          to paragraph or to character.
    // OD 02.10.2003 #i18732# - adjustments for new option 'FollowTextFlow'
    // OD 12.11.2003 #i22341# - adjustments for new vertical alignment at top of line
    void CalcBoundRect( SwRect& _orRect,
                        const RndStdIds _nAnchorId,
                        const sal_Int16 _eHoriRelOrient = com::sun::star::text::RelOrientation::FRAME,
                        const sal_Int16 _eVertRelOrient = com::sun::star::text::RelOrientation::FRAME,
                        const SwPosition* _pToCharCntntPos = NULL,
                        const bool _bFollowTextFlow = false,
                        bool _bMirror = false,
                        Point* _opRef = NULL,
                        Size* _opPercent = NULL ) const;

	// Groesse von Drawobjekten setzen
	void SetObjRect( const SwRect& rRect );

	long BeginDrag( const Point *pPt, sal_Bool bProp );
	long Drag	  ( const Point *pPt, sal_Bool bProp );
	long EndDrag  ( const Point *pPt, sal_Bool bProp );
	void BreakDrag();

	//Methoden fuer die Statuszeile.
	Point GetAnchorObjDiff() const;	//Abstand zum Anker
	Point GetObjAbsPos()	 const; //Absolute Position
	Size  GetObjSize()	     const;	//Groesse, ggf. die umschliessende

	//SS fuer die BriefUmschlaege: hole alle Seitengebundenen Objekte
	//und setze diese auf eine neue Seite.
	void GetPageObjs( SvPtrarr& rFillArr );
	void SetPageObjsNewPage( SvPtrarr& rFillArr, int nOffset = 1 );

	// zeige die aktuelle Selektion an ( ggfs. den Rahmen/DrawObject)
	virtual void MakeSelVisible();

	// returne das FrmFmt von dem evt. unter dem Point stehenden Object.
	// Das Object wird nicht selektiert!
	const SwFrmFmt* GetFmtFromObj( const Point& rPt, SwRect** pRectToFill = 0 ) const;
	// returns a format too, if the point is over the text of any fly
	const SwFrmFmt* GetFmtFromAnyObj( const Point& rPt ) const;

	//Welcher Schutz ist am selektierten Objekt gesetzt?
    //!! returns several flags in sal_uInt8
	sal_uInt8 IsSelObjProtected( sal_uInt16 /*FLYPROTECT_...*/ eType ) const;

	//Liefert neben der Grafik in rName bei gelinkten Grafiken den Namen mit
	//Pfad und sonst den Grafiknamen. rbLink ist TRU bei gelinkten Grafiken.
	const Graphic *GetGrfAtPos( const Point &rDocPos,
								String &rName, sal_Bool &rbLink ) const;

    // --> OD 2009-07-13 #i73249#
    const String GetObjTitle() const;
    void SetObjTitle( const String& rTitle );
    const String GetObjDescription() const;
    void SetObjDescription( const String& rDescription );
    // <--

//SS fuer Rahmen --------------------------------------------

	sal_Bool IsFrmSelected() const;
	sal_Bool GetFlyFrmAttr( SfxItemSet &rSet ) const;
	sal_Bool SetFlyFrmAttr( SfxItemSet &rSet );
	sal_Bool ResetFlyFrmAttr( sal_uInt16 nWhich, const SfxItemSet* pSet = 0 );
	const SwFrmFmt *NewFlyFrm( const SfxItemSet &rSet, sal_Bool bAnchValid = sal_False,
						 SwFrmFmt *pParent = 0 );
	void SetFlyPos( const Point &rAbsPos);
	Point FindAnchorPos( const Point &rAbsPos, sal_Bool bMoveIt = sal_False );
    // determines whether a frame or its environment is vertically formatted and right-to-left
    // --> OD 2009-08-31 #mongolianlayout#
    // also determines, if frame or its environmane is in mongolianlayout (vertical left-to-right)
    // - add output parameter <bVertL2R>
    sal_Bool IsFrmVertical(const sal_Bool bEnvironment, sal_Bool& bRightToLeft, sal_Bool& bVertL2R) const;

	SwFrmFmt* GetCurFrmFmt() const;	//Wenn Rahmen, dann Rahmenvorlage, sonst 0
	void SetFrmFmt( SwFrmFmt *pFmt, sal_Bool bKeepOrient = sal_False, Point* pDocPos = 0 );	//Wenn Rahmen, dann Rahmenvorlage setzen
	const SwFlyFrm *GetCurrFlyFrm() const { return FindFlyFrm(); }

	// finde/loeschen den Fly, in dem der Cursor steht
	SwFrmFmt* WizzardGetFly();

	//Selebstaendiges selektieren von Flys
    sal_Bool GotoNextFly( sal_uInt16 /*GOTOOBJ_...*/ eType = GOTOOBJ_FLY_ANY )
                                { return GotoObj( sal_True, eType ); }
    sal_Bool GotoPrevFly( sal_uInt16 /*GOTOOBJ_...*/ eType = GOTOOBJ_FLY_ANY)
                                { return GotoObj( sal_False, eType); }

	//iterieren ueber Flys - fuer Basic-Collections
	sal_uInt16 GetFlyCount( FlyCntType eType = FLYCNTTYPE_ALL ) const;
	const SwFrmFmt* GetFlyNum(sal_uInt16 nIdx, FlyCntType eType = FLYCNTTYPE_ALL) const;

	//Wenn ein fly selectiert ist, zieht er den Crsr in den ersten CntntFrm
	const SwFrmFmt* SelFlyGrabCrsr();

	//Get FlyFrameFormat; fuer UI Macro Anbindung an Flys
	const SwFrmFmt* GetFlyFrmFmt() const;
	      SwFrmFmt* GetFlyFrmFmt();

	//OLE, Server fordert neue Groesse an, die gewuenschten Werte werden
	//als Rahmenattribute eingestellt. Wenn die Werte nicht erlaubt sind,
	//so wird von der Formatierung geclippt und eine Scalierung eingestellt.
	//siehe CalcAndSetScale().
	// The return value is the applied size.
    Size RequestObjectResize( const SwRect &rRect, const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& );

    //The layout has been changed, so the active object has to be moved after that
    virtual void MoveObjectIfActive( svt::EmbeddedObjectRef& xObj, const Point& rOffset );

	//Der Client fuer das OleObject muss bezueglich der Scalierung auf dem
	//neuesten Stand gehalten werden. Impl in der WrtShell.
	//Wird ein Pointer auf eine Size uebergeben, so ist diese die aktuelle
	//Core-Groesse des Objectes. Anderfalls wird die Groesse per GetCurFlyRect()
	//besorgt.
    virtual void CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
								  const SwRect *pFlyPrtRect = 0,
                                  const SwRect *pFlyFrmRect = 0,
                                  const bool bNoTxtFrmPrtAreaChanged = false ) = 0;

	//Objekte mit ActivateWhenVisible werden beim Paint Connected.
	//gerufen von notxtfrm::Paint, impl in wrtsh
    virtual void ConnectObj( svt::EmbeddedObjectRef&,
                             const SwRect &rPrt,
							 const SwRect &rFrm ) = 0;

	//Sichbaren Bereich auf das Object setzen, wenn es noch nicht sichtbar ist.
    void MakeObjVisible( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& ) const;

	// check resize of OLE-Object
	sal_Bool IsCheckForOLEInCaption() const 		{ return bCheckForOLEInCaption; }
	void SetCheckForOLEInCaption( sal_Bool bFlag )	{ bCheckForOLEInCaption = bFlag; }

	// setze am selektierten FlyFrame einen Namen
	void SetFlyName( const String& rName );
	const String& GetFlyName() const;

    // get reference to OLE object (if there is one) for selected FlyFrame
    const com::sun::star::uno::Reference < com::sun::star::embed::XEmbeddedObject > GetOleRef() const;

	// erezeuge eindeutige Namen fuer Rahmen
	String GetUniqueGrfName() const;
	String GetUniqueOLEName() const;
	String GetUniqueFrameName() const;

	// springe zum benannten Rahmen (Grafik/OLE)
	sal_Bool GotoFly( const String& rName, FlyCntType eType = FLYCNTTYPE_ALL,
					sal_Bool bSelFrame = sal_True );
	// steht an der Position eine Grafik mit einer URL ?
	const SwFrmFmt* IsURLGrfAtPos( const Point& rPt, String* pURL = 0,
									String *pTargetFrameName = 0,
									String *pURLDescription = 0 ) const;

	//Fuer das Chain wird immer der durch das Format spezifizierte Fly
	//mit dem durch den Point getroffenen verbunden.
	//In rRect wird das Rect des Flys geliefert (fuer Highlight desselben)
	int Chainable( SwRect &rRect, const SwFrmFmt &rSource, const Point &rPt ) const;
	int Chain( SwFrmFmt &rSource, const Point &rPt );
    int Chain( SwFrmFmt &rSource, const SwFrmFmt &rDest );
    void Unchain( SwFrmFmt &rFmt );
	void HideChainMarker();
	void SetChainMarker();

	Size GetGraphicDefaultSize() const;

//SS fuer DrawObjekte ---------------------

	//Temporaer um Bug zu umgehen.
	void CheckUnboundObjects();

	//Achtung: Uneindeutikeiten bei Mehrfachselektionen.
	sal_Bool GetObjAttr( SfxItemSet &rSet ) const;
	sal_Bool SetObjAttr( const SfxItemSet &rSet );

    const SdrObject* GetBestObject( sal_Bool bNext, sal_uInt16 eType = GOTOOBJ_DRAW_ANY, sal_Bool bFlat = sal_True, const ::svx::ISdrObjectFilter* pFilter = NULL );
    sal_Bool GotoObj( sal_Bool bNext, sal_uInt16 /*GOTOOBJ_...*/ eType = GOTOOBJ_DRAW_ANY);

	//Setzen vom DragMode (z.B. Rotate), tut nix bei Rahmenselektion.
	void SetDragMode( sal_uInt16 eSdrDragMode );

	sal_uInt16 IsObjSelected() const;	//Liefert gleich die Anzahl der Objekte,
									//zaehlt aber nicht die Objekte in Gruppen.
	sal_Bool IsObjSelected( const SdrObject& rObj ) const;

	void EndTextEdit();				//Loescht ggf. das Objekt.

	//Ankertyp des selektierten Objektes, -1 bei Uneindeutigkeit oder
    //Rahmenselektion; FLY_AT_PAGE bzw. FLY_AT_PARA aus frmatr.hxx sonst.
	short GetAnchorId() const;

	//Erzeugen von DrawObjekten, beim Begin wird der Objekttyp mitgegeben.
	//Beim End kann ein Cmd mitgegeben werden, hier ist ggf.
	//SDRCREATE_RESTRAINTEND fuer Ende oder SDRCREATE_NEXTPOINT fuer ein
	//Polygon relevant. Nach dem RESTRAINTEND ist das Objekt erzeugt und
	//selektiert.
	//Mit BreakCreate wird der Vorgang abgebrochen, dann ist kein Objekt
	//mehr selektiert.
    sal_Bool BeginCreate( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, const Point &rPos );
	sal_Bool BeginCreate( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, sal_uInt32 eObjInventor, const Point &);
	void MoveCreate ( const Point &rPos );
	sal_Bool EndCreate	( sal_uInt16 eSdrCreateCmd );
	void BreakCreate();
	sal_Bool IsDrawCreate() const;
    void CreateDefaultShape( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, const Rectangle& rRect, sal_uInt16 nSlotId);

	// Funktionen f�r Rubberbox, um Draw-Objekte zu selektieren
	sal_Bool BeginMark( const Point &rPos );
	void MoveMark ( const Point &rPos );
	sal_Bool EndMark  ();
	void BreakMark();

	//Gruppe erzeugen, aufloesen, nix bei Rahmenselektion.
	sal_Bool IsGroupSelected();		//Kann auch eine Mischselektion sein!
	void GroupSelection();		//Hinterher ist die Gruppe selektiert.
	void UnGroupSelection();	//Die Einzelobjekte sind Selektiert
								//Es koennen noch immer Gruppen dabei sein.

    // OD 27.06.2003 #108784# - change return type.
    bool IsGroupAllowed() const;

	void MirrorSelection( sal_Bool bHorizontal );	//Bei sal_False Vertikal

	//frmatr.hxx. Hier kein enum wg. Abhaengigkeiten
	//Der sal_Bool ist nur fuer internen Gebrauch! Anker wird nur - anhand der
	//aktuellen Dokumentposition - neu gesetzt aber nicht umgesetzt.
	void ChgAnchor( int eAnchorId, sal_Bool bSameOnly = sal_False,
								   sal_Bool bPosCorr = sal_True );

    sal_Bool SetDrawingAttr( SfxItemSet &rSet );

    // hole die selectierten DrawObj als Grafik (MetaFile/Bitmap)
	// Return-Wert besagt ob konvertiert wurde!!
	sal_Bool GetDrawObjGraphic( sal_uLong nFmt, Graphic& rGrf ) const;

	void Paste( SvStream& rStm, sal_uInt16 nAction, const Point* pPt = 0 );
	sal_Bool Paste( const Graphic &rGrf );
	sal_Bool Paste( SotDataObject& rObj, const Point& rPt );

	sal_Bool IsAlignPossible() const;
	void SetCalcFieldValueHdl(Outliner* pOutliner);

	void Insert(const String& rGrfName,
				const String& rFltName,
				const Graphic* pGraphic = 0,
				const SfxItemSet* pFlyAttrSet = 0,
				const SfxItemSet* pGrfAttrSet = 0,
				SwFrmFmt* = 0 );

    // Insertion of a drawing object which have to be already inserted in the DrawModel
    void InsertDrawObj( SdrObject& rDrawObj,
                        const Point& rInsertPosition );

	sal_Bool ReplaceSdrObj( const String& rGrfName, const String& rFltName,
						const Graphic* pGrf = 0 );

	// --> #i972#
    // for starmath formulas anchored 'as char' it alignes it baseline to baseline
    // changing the previous vertical orientation
    void AlignFormulaToBaseline( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& xObj, SwFlyFrm * pFly = 0 );

    // aligns all formulas with anchor 'as char' to baseline
    void AlignAllFormulasToBaseline();
    // <--

//------------------------------------------

	//Auskunft ueber naechstliegenden Inhalt zum uebergebenen Point
	Point GetCntntPos( const Point& rPoint, sal_Bool bNext ) const;

    //convert document position into position relative to the current page
    Point GetRelativePagePosition(const Point& rDocPos);

    //Layout-Selektion Hiden/Zeigen und aufruf an die CrsrSh weiterreichen.
	void ShLooseFcs();
	void ShGetFcs( sal_Bool bUpdate = sal_True );

	//PageDescriptor-Schnittstelle
	void   ChgCurPageDesc( const SwPageDesc& );
	sal_uInt16 GetCurPageDesc( const sal_Bool bCalcFrm = sal_True ) const;
    sal_uInt16 GetMousePageDesc( const Point &rPt ) const;
    sal_uInt16 GetPageDescCnt() const;
	SwPageDesc* FindPageDescByName( const String& rName,
									sal_Bool bGetFromPool = sal_False,
									sal_uInt16* pPos = 0 );

	const SwPageDesc& GetPageDesc( sal_uInt16 i ) const;
	void  ChgPageDesc( sal_uInt16 i, const SwPageDesc& );
	// if inside all selection only one PageDesc, return this.
	// Otherwise return 0 pointer
	const SwPageDesc* GetSelectedPageDescs() const;

	const SwRect& GetAnyCurRect( CurRectType eType,
								 const Point* pPt = 0,
                                 const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& =
                                 ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >() ) const;

	//Seitennummer der Seite in der der Point liegt, 0 wenn keine
	//getroffen ist.
	sal_uInt16 GetPageNumber( const Point &rPoint ) const;
	sal_Bool GetPageNumber( long nYPos, sal_Bool bAtCrsrPos, sal_uInt16& rPhyNum, sal_uInt16& rVirtNum, String &rDisplay ) const;

    SwFlyFrmFmt* InsertObject( const svt::EmbeddedObjectRef&,
				const SfxItemSet* pFlyAttrSet = 0,
				const SfxItemSet* pGrfAttrSet = 0,
				SwFrmFmt* = 0 );
	sal_Bool 	FinishOLEObj();								// Server wird beendet

	//Attribute der Tabelle besorgen/setzen.
	void GetTblAttr( SfxItemSet & ) const;
	void SetTblAttr( const SfxItemSet & );

	//Tabelle vollstaendig selektiert?
	sal_Bool HasWholeTabSelection() const;
	//Ist der Inhalt einer Tabellenzelle oder mindestens eine Tabellenzelle
	//vollstaendig selektiert ist
	sal_Bool HasBoxSelection() const;

	sal_Bool InsertRow( sal_uInt16 nCnt, sal_Bool bBehind );
	sal_Bool InsertCol( sal_uInt16 nCnt, sal_Bool bBehind );  // 0 == am Ende
	sal_Bool DeleteCol();
	sal_Bool DeleteRow();

	sal_Bool DeleteTblSel();		//Aktuelle Selektion, ggf. die ganze Tabelle.

	sal_uInt16 MergeTab();			//Merged selektierte Tabellenteile zusammen
								//Fehler ueber enum zurueck
    // Zelle Vertikal oder Horizontal splitten.
    sal_Bool SplitTab( sal_Bool nVert = sal_True, sal_uInt16 nCnt = 1, sal_Bool bSameHeight = sal_False );
	sal_Bool Sort(const SwSortOptions&);	//Sortieren.

	void SetRowHeight( const SwFmtFrmSize &rSz );
	//Der Pointer muss vom Aufrufer zerstoert werden wenn != 0
	void GetRowHeight( SwFmtFrmSize *&rpSz ) const;

    void SetRowSplit( const SwFmtRowSplit &rSz );
    void GetRowSplit( SwFmtRowSplit *&rpSz ) const;

	void   SetBoxAlign( sal_uInt16 nOrient );
	sal_uInt16 GetBoxAlign() const;			//USHRT_MAX fuer uneindeutig!

	//Ausgleichen der Zeilenhoehen. Mit bTstOnly festellen ob mehr als eine
	//Zeile markiert ist.
	sal_Bool BalanceRowHeight( sal_Bool bTstOnly );

	void SetTabBorders( const SfxItemSet& rSet );
	void GetTabBorders( 	  SfxItemSet& rSet) const;
	void SetTabLineStyle(const Color* pColor, sal_Bool bSetLine = sal_False, const SvxBorderLine* pBorderLine = NULL);

	void SetTabBackground( const SvxBrushItem &rNew );
	void GetTabBackground( SvxBrushItem &rToFill ) const;

	void SetBoxBackground( const SvxBrushItem &rNew );
	sal_Bool GetBoxBackground( SvxBrushItem &rToFill ) const; //sal_False uneindeutig

    void SetBoxDirection( const SvxFrameDirectionItem& rNew );
    sal_Bool GetBoxDirection( SvxFrameDirectionItem& rToFill ) const; //sal_False uneindeutig

    void SetRowBackground( const SvxBrushItem &rNew );
	sal_Bool GetRowBackground( SvxBrushItem &rToFill ) const; //sal_False uneindeutig

    sal_uInt8 WhichMouseTabCol( const Point &rPt ) const;
    void GetTabCols( SwTabCols &rToFill ) const; //Spalten- und Randinfo.
    void SetTabCols( const SwTabCols &rNew, sal_Bool bCurRowOnly = sal_True );
    void GetMouseTabCols( SwTabCols &rToFill, const Point &rPt ) const;
	void SetMouseTabCols( const SwTabCols &rNew, sal_Bool bCurRowOnly,
                          const Point &rPt );

    // --> FME 2004-07-30 #i20126# Enhanced table selection
    // pEnd will be used during MouseMove
    bool SelTblRowCol( const Point& rPt, const Point* pEnd = 0, bool bRowDrag = false );
    // <--

    // #i24134# adjustment of table rows via Ruler
    void GetTabRows( SwTabCols &rToFill ) const;
    void SetTabRows( const SwTabCols &rNew, sal_Bool bCurColOnly );
    void GetMouseTabRows( SwTabCols &rToFill, const Point &rPt ) const;
    void SetMouseTabRows( const SwTabCols &rNew, sal_Bool bCurColOnly, const Point &rPt );

    void ProtectCells();    //Falls eine Tabselektion besteht, wird sie ver-
							// nichtet, wenn der Cursor nicht in Readonly darf
	void UnProtectCells();	// auf die Tabellenselektin
	void UnProtectTbls();	//bei allen Tabellen in der Selektion den Schutz aufheben
	sal_Bool HasTblAnyProtection( const String* pTblName = 0,
								sal_Bool* pFullTblProtection = 0 );
	sal_Bool CanUnProtectCells() const;

    sal_uInt16 GetRowsToRepeat() const;
    void SetRowsToRepeat( sal_uInt16 nNumOfRows );
    sal_uInt16 GetVirtPageNum( const sal_Bool bCalcFrm = sal_True );
    //returns the number of table rows currently selected
    //if the selection start at the top of the table
    sal_uInt16    GetRowSelectionFromTop() const;

    sal_Bool IsInRepeatedHeadline() const { return CheckHeadline( true ); }
    sal_Bool IsInHeadline() const { return CheckHeadline( false ); }

	//Stellt die Breiten der Zellen so ein, dass der Inhalt moeglichst
	//nicht umgebrochen werden muss.
	//bBalance sorgt fuer einen Ausgleich der markierten Spalten.
	void AdjustCellWidth( sal_Bool bBalance = sal_False );
	//Nicht erlaubt, wenn nur  leere Zellen selektiert sind.
	sal_Bool IsAdjustCellWidthAllowed( sal_Bool bBalance = sal_False ) const;

	//Ausgleich der Zellenbreiten, mit bTstOnly feststellen, ob mehr als
	//eine Zelle markiert ist.
	sal_Bool BalanceCellWidth( sal_Bool bTstOnly );

		// AutoFormat fuer die Tabelle/TabellenSelection
	sal_Bool SetTableAutoFmt( const SwTableAutoFmt& rNew );
		// Erfrage wie attributiert ist
	sal_Bool GetTableAutoFmt( SwTableAutoFmt& rGet );
		// aender eine  Zellenbreite/-Hoehe/Spaltenbreite/Zeilenhoehe
	sal_Bool SetColRowWidthHeight( sal_uInt16 eType, sal_uInt16 nDiff = 283 );
		// Autosumme
	sal_Bool GetAutoSum( String& rFml ) const;

	//Phy:	Tatsaechliche Seitenanzahl.
	//Virt: Vom User evtl. gesetzten Offset mit einbeziehen.
	sal_uInt16	GetPhyPageNum();

	// Setzt an der aktuellen Postion einen neuen Page Offset
	void SetNewPageOffset( sal_uInt16 nOffset );
	void SetPageOffset( sal_uInt16 nOffset );	//Aendert den letzten Page Offset
	sal_uInt16 GetPageOffset() const;			//Liefert den letzten Page Offset

	//SS fuer Beschriftungen
    void InsertLabel( const SwLabelType eType, const String &rTxt, const String& rSeparator,
                      const String& rNumberSeparator,
					  const sal_Bool bBefore, const sal_uInt16 nId,
                      const String& rCharacterStyle,
                      const sal_Bool bCpyBrd = sal_True );

	//Das Lineal will auch noch etwas von uns wissen.
	sal_uInt16 GetCurColNum( SwGetCurColNumPara* pPara = 0 ) const;	//0 == in keiner Spalte
	sal_uInt16 GetCurMouseColNum( const Point &rPt,
							SwGetCurColNumPara* pPara = 0 ) const;
	sal_uInt16 GetCurTabColNum() const;		//0 == in keiner Tabelle
	sal_uInt16 GetCurMouseTabColNum( const Point &rPt ) const;
	sal_uInt16 GetCurOutColNum( SwGetCurColNumPara* pPara = 0 ) const;	// aktuelle aeussere Spalte

    sal_Bool IsTableRightToLeft() const;
    sal_Bool IsMouseTableRightToLeft( const Point &rPt ) const;
    sal_Bool IsTableVertical() const;

    sal_Bool IsLastCellInRow() const;
    // Die Breite des aktuellen Bereichs fuer Spaltendialog
	long GetSectionWidth( SwFmt& rFmt ) const;

    void GetConnectableFrmFmts
    (SwFrmFmt & rFmt, const String & rReference, sal_Bool bSuccessors,
     ::std::vector< String > & aPrevPageVec,
     ::std::vector< String > & aThisPageVec,
     ::std::vector< String > & aNextPageVec,
     ::std::vector< String > & aRestVec);

    /** SwFEShell::GetShapeBackgrd

        OD 02.09.2002 for #102450#:
        method determines background color of the page the selected drawing
        object is on and returns this color.
        If no color is found, because no drawing object is selected or ...,
        color COL_BLACK (default color on constructing object of class Color)
        is returned.

        @author OD

        @returns an object of class Color
    */
    const Color GetShapeBackgrd() const;

    /** Is default horizontal text direction for selected drawing object right-to-left

        OD 09.12.2002 #103045#
        Because drawing objects only painted for each page only, the default
        horizontal text direction of a drawing object is given by the corresponding
        page property.

        @author OD

        @returns boolean, indicating, if the horizontal text direction of the
        page, the selected drawing object is on, is right-to-left.
    */
    bool IsShapeDefaultHoriTextDirR2L() const;

    void ParkCursorInTab();

    // -> #i23726#
    SwTxtNode * GetNumRuleNodeAtPos(const Point &rPot);
    sal_Bool IsNumLabel( const Point &rPt, int nMaxOffset = -1 );
    // <- #i23726#
    // --> OD 2005-02-21 #i42921#
    bool IsVerticalModeAtNdAndPos( const SwTxtNode& _rTxtNode,
                                   const Point& _rDocPos ) const;
    // <--

};

#endif
