xref: /aoo41x/main/sw/inc/fesh.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _FESH_HXX
28 #define _FESH_HXX
29 
30 #include <com/sun/star/text/RelOrientation.hpp>
31 #include <com/sun/star/embed/XClassifiedObject.hpp>
32 #include <com/sun/star/embed/XEmbeddedObject.hpp>
33 
34 #include <svx/svdobj.hxx>
35 #include "swdllapi.h"
36 #include <editsh.hxx>
37 #include <flyenum.hxx>
38 
39 // OD 25.06.2003 #108784#
40 #include <svx/svdtypes.hxx>
41 
42 #include <svtools/embedhlp.hxx>
43 
44 #ifndef INCLUDED_VECTOR
45 #include <vector>
46 #define INCLUDED_VECTOR
47 #endif
48 
49 
50 class SwFlyFrm;
51 class SwTabCols;
52 class SvxBrushItem;
53 class SvxFrameDirectionItem;
54 class SwTableAutoFmt;
55 class SwFrm;
56 class SwFmtFrmSize;
57 class SwFmtRowSplit;
58 class SvxBorderLine;
59 class SdrObject;
60 class Color;
61 class Outliner;
62 class SotDataObject;
63 class SwFrmFmt;
64 struct SwSortOptions;
65 class SdrMarkList;
66 
67 namespace svx
68 {
69     class ISdrObjectFilter;
70 }
71 
72 
73 // return values for GetFrmType() und GetSelFrmType().
74 //! values can be combined via logival or
75 #define FRMTYPE_NONE			(sal_uInt16)     0
76 #define FRMTYPE_PAGE			(sal_uInt16)     1
77 #define FRMTYPE_HEADER			(sal_uInt16)     2
78 #define FRMTYPE_FOOTER			(sal_uInt16)     4
79 #define FRMTYPE_BODY			(sal_uInt16)     8
80 #define FRMTYPE_COLUMN			(sal_uInt16)    16
81 #define FRMTYPE_TABLE			(sal_uInt16)    32
82 #define FRMTYPE_FLY_FREE		(sal_uInt16)    64
83 #define FRMTYPE_FLY_ATCNT		(sal_uInt16)   128
84 #define FRMTYPE_FLY_INCNT		(sal_uInt16)   256
85 #define FRMTYPE_FOOTNOTE		(sal_uInt16)   512
86 #define FRMTYPE_FTNPAGE			(sal_uInt16)  1024
87 #define FRMTYPE_FLY_ANY			(sal_uInt16)  2048
88 #define FRMTYPE_DRAWOBJ			(sal_uInt16)  4096
89 #define FRMTYPE_COLSECT			(sal_uInt16)  8192
90 #define FRMTYPE_COLSECTOUTTAB 	(sal_uInt16) 16384
91 
92 #define FRMTYPE_ANYCOLSECT ( FRMTYPE_COLSECT | FRMTYPE_COLSECTOUTTAB )
93 
94 //! values can be combined via logival or
95 #define GOTOOBJ_DRAW_CONTROL 	(sal_uInt16)  1
96 #define GOTOOBJ_DRAW_SIMPLE 	(sal_uInt16)  2
97 #define GOTOOBJ_DRAW_ANY 		(sal_uInt16)  3
98 #define GOTOOBJ_FLY_FRM 		(sal_uInt16)  4
99 #define GOTOOBJ_FLY_GRF 		(sal_uInt16)  8
100 #define GOTOOBJ_FLY_OLE 		(sal_uInt16) 16
101 #define GOTOOBJ_FLY_ANY 		(sal_uInt16) 28
102 #define GOTOOBJ_GOTO_ANY 		(sal_uInt16) 31
103 
104 //! values can be combined via logival or
105 #define FLYPROTECT_CONTENT		(sal_uInt16)  1		// kann verodert werden!
106 #define FLYPROTECT_SIZE			(sal_uInt16)  2
107 #define FLYPROTECT_POS			(sal_uInt16)  4
108 #define FLYPROTECT_PARENT 		(sal_uInt16)  8 	// nur Parents untersuchen
109 #define FLYPROTECT_FIXED		(sal_uInt16) 16		// nur nicht aufhebbarer Schutz
110 												// z.B. durch OLE-Server, gilt auch
111 												// fuer Dialog
112 
113 
114 enum ObjCntType		//Fuer das Ermitteln des Cntnts per Positon (D&D)
115 {
116 	OBJCNT_NONE,
117 	OBJCNT_FLY,
118 	OBJCNT_GRF,
119 	OBJCNT_OLE,
120 	OBJCNT_SIMPLE,
121 	OBJCNT_CONTROL,
122 	OBJCNT_URLBUTTON,
123 
124 	OBJCNT_GROUPOBJ,
125 	OBJCNT_DONTCARE		// nicht bestimmbar - unterschiedliche Objecte selektiert
126 };
127 
128 //fuer GetAnyCurRect
129 enum CurRectType
130 {
131 	RECT_PAGE,					//Rect der aktuellen Seite.
132 	RECT_PAGE_CALC,				//... Seite wird ggf. Formatiert
133 	RECT_PAGE_PRT,              //Rect der aktuellen PrtArea der Seite
134 	RECT_FRM,                   //Rect des aktuellen Rahmen
135 	RECT_FLY_EMBEDDED,          //Rect des aktuellen FlyFrm
136 	RECT_FLY_PRT_EMBEDDED,      //Rect der PrtArea des FlyFrm
137 	RECT_SECTION,				//Rect des aktuellen Bereichs
138 	RECT_OUTTABSECTION,			//Rect des aktuellen Bereichs,
139 								// aber ausserhalb der Tabelle
140 	RECT_SECTION_PRT,  			//Rect der aktuellen PrtArea des Bereichs
141 	RECT_OUTTABSECTION_PRT, 	//Rect der aktuellen PrtArea des Bereichs,
142 								// aber ausserhalb der Tabelle
143 	RECT_HEADERFOOTER,     		//Rect des aktuellen Headers/Footer
144     RECT_HEADERFOOTER_PRT,      //Rect der PrtArea des aktuellen Headers/Footers
145 
146     RECT_PAGES_AREA             //Rect covering the pages area
147 };
148 
149 struct SwGetCurColNumPara
150 {
151 	const SwFrmFmt* pFrmFmt;
152 	const SwRect* pPrtRect, *pFrmRect;
153 	SwGetCurColNumPara() : pFrmFmt( 0 ), pPrtRect( 0 ), pFrmRect( 0 ) {}
154 };
155 
156 #define SW_PASTESDR_INSERT		1
157 #define SW_PASTESDR_REPLACE		2
158 #define SW_PASTESDR_SETATTR		3
159 
160 #define SW_ADD_SELECT   1
161 #define SW_ENTER_GROUP  2
162 #define SW_LEAVE_FRAME  4
163 
164 #define SW_MOVE_UP      0
165 #define SW_MOVE_DOWN    1
166 #define SW_MOVE_LEFT    2
167 #define SW_MOVE_RIGHT   3
168 
169 #define SW_TABCOL_NONE          0
170 #define SW_TABCOL_HORI          1
171 #define SW_TABCOL_VERT          2
172 #define SW_TABROW_HORI          3
173 #define SW_TABROW_VERT          4
174 // --> FME 2004-07-30 #i32329# Enhanced table selection
175 #define SW_TABSEL_HORI          5
176 #define SW_TABSEL_HORI_RTL      6
177 #define SW_TABROWSEL_HORI       7
178 #define SW_TABROWSEL_HORI_RTL   8
179 #define SW_TABCOLSEL_HORI       9
180 #define SW_TABSEL_VERT          10
181 #define SW_TABROWSEL_VERT       11
182 #define SW_TABCOLSEL_VERT       12
183 // <--
184 
185 class SdrDropMarkerOverlay;
186 
187 class SW_DLLPUBLIC SwFEShell : public SwEditShell
188 {
189 	SdrDropMarkerOverlay *pChainFrom, *pChainTo;
190 	sal_Bool bCheckForOLEInCaption;
191 
192 	SW_DLLPRIVATE SwFlyFrm *FindFlyFrm() const;
193     SW_DLLPRIVATE SwFlyFrm *FindFlyFrm( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >&  ) const;
194 
195 	//Actions fuer alle Shells beenden und ChangeLink rufen.
196 	SW_DLLPRIVATE void EndAllActionAndCall();
197 
198 	SW_DLLPRIVATE void ScrollTo( const Point &rPt );
199 
200     // OD 25.06.2003 #108784# - correct type of 1st parameter
201     SW_DLLPRIVATE void ChangeOpaque( SdrLayerID nLayerId );
202 
203     // Used for mouse operations on a table:
204     // Returns a cell frame that is 'close' to rPt.
205     SW_DLLPRIVATE const SwFrm *GetBox( const Point &rPt, bool* pbRow = 0, bool* pbCol = 0 ) const;
206 
207 	//0 == in keiner Spalte
208 	SW_DLLPRIVATE sal_uInt16 _GetCurColNum( const SwFrm *pFrm,
209 						  SwGetCurColNumPara* pPara ) const;
210 
211     SW_DLLPRIVATE void _GetTabCols( SwTabCols &rToFill, const SwFrm *pBox ) const;
212     SW_DLLPRIVATE void _GetTabRows( SwTabCols &rToFill, const SwFrm *pBox ) const;
213 
214 	SW_DLLPRIVATE sal_Bool ImpEndCreate();
215 
216 	SW_DLLPRIVATE ObjCntType GetObjCntType( const SdrObject& rObj ) const;
217 
218 	// Methoden fuers kopieren von DrawObjecten
219 	SW_DLLPRIVATE sal_Bool CopyDrawSel( SwFEShell* pDestShell, const Point& rSttPt,
220 								const Point& rInsPt, sal_Bool bIsMove,
221 								sal_Bool bSelectInsert );
222 
223     // get list of marked SdrObjects;
224     // helper method for GetSelFrmType, IsSelContainsControl
225     SW_DLLPRIVATE const SdrMarkList* _GetMarkList() const;
226 
227     SW_DLLPRIVATE sal_Bool CheckHeadline( bool bRepeat ) const;
228 
229     using SwEditShell::Copy;
230 
231 public:
232 
233     using SwEditShell::Insert;
234 
235 	TYPEINFO();
236     SwFEShell( SwDoc& rDoc, Window *pWin, const SwViewOption *pOpt = 0 );
237 	SwFEShell( SwEditShell& rShell, Window *pWin );
238 	virtual ~SwFEShell();
239 
240 	// Copy und Paste Methoden fuer das interne Clipboard
241 	sal_Bool Copy( SwDoc* pClpDoc, const String* pNewClpTxt = 0 );
242     sal_Bool Paste( SwDoc* pClpDoc, sal_Bool bIncludingPageFrames = sal_False);
243     //paste some pages into another doc - used in mailmerge
244     sal_Bool PastePages( SwFEShell& rToFill, sal_uInt16 nStartPage, sal_uInt16 nEndPage);
245 	// Copy-Methode fuer Drag&Drop
246 	sal_Bool Copy( SwFEShell*, const Point& rSttPt, const Point& rInsPt,
247 				sal_Bool bIsMove = sal_False, sal_Bool bSelectInsert = sal_True );
248 
249 	void SelectFlyFrm( SwFlyFrm& rFrm, sal_Bool bNew = sal_False );
250 
251 	// befindet sich der selektierte Rahmen innerhalb eines anderen?
252 	const SwFrmFmt* IsFlyInFly();
253 
254 //SS fuer DrawObjekte und Rahmen-----------------------------
255 
256 	//Wenn ein Objekt angegeben wurde, so wird genau diese Markiert (anstatt
257 	//ueber die Position zu suchen.
258     sal_Bool SelectObj( const Point& rSelPt, sal_uInt8 nFlag = 0, SdrObject *pObj = 0 );
259 	void DelSelectedObj();
260 
261 	//Selektion nach oben unten bewegen (Z-Order).
262 	//sal_True	== ganz nach oben/unten
263 	//sal_False == einen ueberholen
264 	void SelectionToTop   ( sal_Bool bTop = sal_True );
265 	void SelectionToBottom( sal_Bool bBottom = sal_True );
266 
267 	short GetLayerId() const;	//1 Heaven, 0 Hell, -1 Uneindeutig
268 	void  SelectionToHeaven();	//Ueber dem Dokument
269 	void  SelectionToHell();	//Unter dem Dokument
270 
271 	// folgende zwei Methoden returnen den enum SdrHdlKind, um sich ein
272 	// includen von SVDRAW.HXX zu ersparen als int deklariert.
273     bool IsObjSelectable( const Point& rPt );
274     int IsInsideSelectedObj( const Point& rPt );    //!! returns enum values
275 
276 	// #107513#
277 	// Test if there is a draw object at that position and if it should be selected.
278 	// The 'should' is aimed at Writer text fly frames which may be in front of
279 	// the draw object.
280 	sal_Bool ShouldObjectBeSelected(const Point& rPt);
281 
282     sal_Bool MoveAnchor( sal_uInt16 nDir );
283 
284     // Returns if Upper of frame at current position is section frame
285     // Currently only used by the rules. To be replaced by something more
286     // sophisticated one day.
287     bool IsDirectlyInSection() const;
288 
289 	//Returnwerte siehe oben FrmType.
290 	//pPt: Crsr bzw. DocPos; bStopAtFly: Bei Flys anhalten oder ueber den Anchor weitergehen
291 	// Obgleich (0,sal_True) eine Art Standard ist, sind die Parameter nicht defaultet, damit
292 	// bei jeder Benutzung insbesondere das bStopAtFly bewusst genutzt wird.
293 	sal_uInt16 GetFrmType( const Point *pPt, sal_Bool bStopAtFly ) const;
294 	sal_uInt16 GetSelFrmType() const;				//Selektion (Drawing)
295 
296     /** #108784# check whether selected frame contains a control;
297      * companion method to GetSelFrmType, used for preventing
298      * drag&drop of controls into header */
299     bool IsSelContainsControl() const;
300 
301 	ObjCntType GetObjCntType( const Point &rPt, SdrObject *&rpObj ) const;
302 	ObjCntType GetObjCntTypeOfSelection( SdrObject** ppObj = 0 ) const;
303 
304 	//Zum Anpassen der PosAttr bei Ankerwechseln.
305 	SwRect  GetObjRect() const;
306 	//Zum Verschieben von Flys mit der Tastatur
307 	SwRect  GetFlyRect() const;
308     // OD 18.09.2003 #i17567#, #108749#, #110354# - adjustments to allow
309     //          negative vertical positions for fly frames anchored
310     //          to paragraph or to character.
311     // OD 02.10.2003 #i18732# - adjustments for new option 'FollowTextFlow'
312     // OD 12.11.2003 #i22341# - adjustments for new vertical alignment at top of line
313     void CalcBoundRect( SwRect& _orRect,
314                         const RndStdIds _nAnchorId,
315                         const sal_Int16 _eHoriRelOrient = com::sun::star::text::RelOrientation::FRAME,
316                         const sal_Int16 _eVertRelOrient = com::sun::star::text::RelOrientation::FRAME,
317                         const SwPosition* _pToCharCntntPos = NULL,
318                         const bool _bFollowTextFlow = false,
319                         bool _bMirror = false,
320                         Point* _opRef = NULL,
321                         Size* _opPercent = NULL ) const;
322 
323 	// Groesse von Drawobjekten setzen
324 	void SetObjRect( const SwRect& rRect );
325 
326 	long BeginDrag( const Point *pPt, sal_Bool bProp );
327 	long Drag	  ( const Point *pPt, sal_Bool bProp );
328 	long EndDrag  ( const Point *pPt, sal_Bool bProp );
329 	void BreakDrag();
330 
331 	//Methoden fuer die Statuszeile.
332 	Point GetAnchorObjDiff() const;	//Abstand zum Anker
333 	Point GetObjAbsPos()	 const; //Absolute Position
334 	Size  GetObjSize()	     const;	//Groesse, ggf. die umschliessende
335 
336 	//SS fuer die BriefUmschlaege: hole alle Seitengebundenen Objekte
337 	//und setze diese auf eine neue Seite.
338 	void GetPageObjs( SvPtrarr& rFillArr );
339 	void SetPageObjsNewPage( SvPtrarr& rFillArr, int nOffset = 1 );
340 
341 	// zeige die aktuelle Selektion an ( ggfs. den Rahmen/DrawObject)
342 	virtual void MakeSelVisible();
343 
344 	// returne das FrmFmt von dem evt. unter dem Point stehenden Object.
345 	// Das Object wird nicht selektiert!
346 	const SwFrmFmt* GetFmtFromObj( const Point& rPt, SwRect** pRectToFill = 0 ) const;
347 	// returns a format too, if the point is over the text of any fly
348 	const SwFrmFmt* GetFmtFromAnyObj( const Point& rPt ) const;
349 
350 	//Welcher Schutz ist am selektierten Objekt gesetzt?
351     //!! returns several flags in sal_uInt8
352 	sal_uInt8 IsSelObjProtected( sal_uInt16 /*FLYPROTECT_...*/ eType ) const;
353 
354 	//Liefert neben der Grafik in rName bei gelinkten Grafiken den Namen mit
355 	//Pfad und sonst den Grafiknamen. rbLink ist TRU bei gelinkten Grafiken.
356 	const Graphic *GetGrfAtPos( const Point &rDocPos,
357 								String &rName, sal_Bool &rbLink ) const;
358 
359     // --> OD 2009-07-13 #i73249#
360     const String GetObjTitle() const;
361     void SetObjTitle( const String& rTitle );
362     const String GetObjDescription() const;
363     void SetObjDescription( const String& rDescription );
364     // <--
365 
366 //SS fuer Rahmen --------------------------------------------
367 
368 	sal_Bool IsFrmSelected() const;
369 	sal_Bool GetFlyFrmAttr( SfxItemSet &rSet ) const;
370 	sal_Bool SetFlyFrmAttr( SfxItemSet &rSet );
371 	sal_Bool ResetFlyFrmAttr( sal_uInt16 nWhich, const SfxItemSet* pSet = 0 );
372 	const SwFrmFmt *NewFlyFrm( const SfxItemSet &rSet, sal_Bool bAnchValid = sal_False,
373 						 SwFrmFmt *pParent = 0 );
374 	void SetFlyPos( const Point &rAbsPos);
375 	Point FindAnchorPos( const Point &rAbsPos, sal_Bool bMoveIt = sal_False );
376     // determines whether a frame or its environment is vertically formatted and right-to-left
377     // --> OD 2009-08-31 #mongolianlayout#
378     // also determines, if frame or its environmane is in mongolianlayout (vertical left-to-right)
379     // - add output parameter <bVertL2R>
380     sal_Bool IsFrmVertical(const sal_Bool bEnvironment, sal_Bool& bRightToLeft, sal_Bool& bVertL2R) const;
381 
382 	SwFrmFmt* GetCurFrmFmt() const;	//Wenn Rahmen, dann Rahmenvorlage, sonst 0
383 	void SetFrmFmt( SwFrmFmt *pFmt, sal_Bool bKeepOrient = sal_False, Point* pDocPos = 0 );	//Wenn Rahmen, dann Rahmenvorlage setzen
384 	const SwFlyFrm *GetCurrFlyFrm() const { return FindFlyFrm(); }
385 
386 	// finde/loeschen den Fly, in dem der Cursor steht
387 	SwFrmFmt* WizzardGetFly();
388 
389 	//Selebstaendiges selektieren von Flys
390     sal_Bool GotoNextFly( sal_uInt16 /*GOTOOBJ_...*/ eType = GOTOOBJ_FLY_ANY )
391                                 { return GotoObj( sal_True, eType ); }
392     sal_Bool GotoPrevFly( sal_uInt16 /*GOTOOBJ_...*/ eType = GOTOOBJ_FLY_ANY)
393                                 { return GotoObj( sal_False, eType); }
394 
395 	//iterieren ueber Flys - fuer Basic-Collections
396 	sal_uInt16 GetFlyCount( FlyCntType eType = FLYCNTTYPE_ALL ) const;
397 	const SwFrmFmt* GetFlyNum(sal_uInt16 nIdx, FlyCntType eType = FLYCNTTYPE_ALL) const;
398 
399 	//Wenn ein fly selectiert ist, zieht er den Crsr in den ersten CntntFrm
400 	const SwFrmFmt* SelFlyGrabCrsr();
401 
402 	//Get FlyFrameFormat; fuer UI Macro Anbindung an Flys
403 	const SwFrmFmt* GetFlyFrmFmt() const;
404 	      SwFrmFmt* GetFlyFrmFmt();
405 
406 	//OLE, Server fordert neue Groesse an, die gewuenschten Werte werden
407 	//als Rahmenattribute eingestellt. Wenn die Werte nicht erlaubt sind,
408 	//so wird von der Formatierung geclippt und eine Scalierung eingestellt.
409 	//siehe CalcAndSetScale().
410 	// The return value is the applied size.
411     Size RequestObjectResize( const SwRect &rRect, const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& );
412 
413     //The layout has been changed, so the active object has to be moved after that
414     virtual void MoveObjectIfActive( svt::EmbeddedObjectRef& xObj, const Point& rOffset );
415 
416 	//Der Client fuer das OleObject muss bezueglich der Scalierung auf dem
417 	//neuesten Stand gehalten werden. Impl in der WrtShell.
418 	//Wird ein Pointer auf eine Size uebergeben, so ist diese die aktuelle
419 	//Core-Groesse des Objectes. Anderfalls wird die Groesse per GetCurFlyRect()
420 	//besorgt.
421     virtual void CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
422 								  const SwRect *pFlyPrtRect = 0,
423 								  const SwRect *pFlyFrmRect = 0 ) = 0;
424 
425 	//Objekte mit ActivateWhenVisible werden beim Paint Connected.
426 	//gerufen von notxtfrm::Paint, impl in wrtsh
427     virtual void ConnectObj( svt::EmbeddedObjectRef&,
428                              const SwRect &rPrt,
429 							 const SwRect &rFrm ) = 0;
430 
431 	//Sichbaren Bereich auf das Object setzen, wenn es noch nicht sichtbar ist.
432     void MakeObjVisible( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& ) const;
433 
434 	// check resize of OLE-Object
435 	sal_Bool IsCheckForOLEInCaption() const 		{ return bCheckForOLEInCaption; }
436 	void SetCheckForOLEInCaption( sal_Bool bFlag )	{ bCheckForOLEInCaption = bFlag; }
437 
438 	// setze am selektierten FlyFrame einen Namen
439 	void SetFlyName( const String& rName );
440 	const String& GetFlyName() const;
441 
442     // get reference to OLE object (if there is one) for selected FlyFrame
443     const com::sun::star::uno::Reference < com::sun::star::embed::XEmbeddedObject > GetOleRef() const;
444 
445 	// erezeuge eindeutige Namen fuer Rahmen
446 	String GetUniqueGrfName() const;
447 	String GetUniqueOLEName() const;
448 	String GetUniqueFrameName() const;
449 
450 	// springe zum benannten Rahmen (Grafik/OLE)
451 	sal_Bool GotoFly( const String& rName, FlyCntType eType = FLYCNTTYPE_ALL,
452 					sal_Bool bSelFrame = sal_True );
453 	// steht an der Position eine Grafik mit einer URL ?
454 	const SwFrmFmt* IsURLGrfAtPos( const Point& rPt, String* pURL = 0,
455 									String *pTargetFrameName = 0,
456 									String *pURLDescription = 0 ) const;
457 
458 	//Fuer das Chain wird immer der durch das Format spezifizierte Fly
459 	//mit dem durch den Point getroffenen verbunden.
460 	//In rRect wird das Rect des Flys geliefert (fuer Highlight desselben)
461 	int Chainable( SwRect &rRect, const SwFrmFmt &rSource, const Point &rPt ) const;
462 	int Chain( SwFrmFmt &rSource, const Point &rPt );
463     int Chain( SwFrmFmt &rSource, const SwFrmFmt &rDest );
464     void Unchain( SwFrmFmt &rFmt );
465 	void HideChainMarker();
466 	void SetChainMarker();
467 
468 	Size GetGraphicDefaultSize() const;
469 
470 //SS fuer DrawObjekte ---------------------
471 
472 	//Temporaer um Bug zu umgehen.
473 	void CheckUnboundObjects();
474 
475 	//Achtung: Uneindeutikeiten bei Mehrfachselektionen.
476 	sal_Bool GetObjAttr( SfxItemSet &rSet ) const;
477 	sal_Bool SetObjAttr( const SfxItemSet &rSet );
478 
479     const SdrObject* GetBestObject( sal_Bool bNext, sal_uInt16 eType = GOTOOBJ_DRAW_ANY, sal_Bool bFlat = sal_True, const ::svx::ISdrObjectFilter* pFilter = NULL );
480     sal_Bool GotoObj( sal_Bool bNext, sal_uInt16 /*GOTOOBJ_...*/ eType = GOTOOBJ_DRAW_ANY);
481 
482 	//Setzen vom DragMode (z.B. Rotate), tut nix bei Rahmenselektion.
483 	void SetDragMode( sal_uInt16 eSdrDragMode );
484 
485 	sal_uInt16 IsObjSelected() const;	//Liefert gleich die Anzahl der Objekte,
486 									//zaehlt aber nicht die Objekte in Gruppen.
487 	sal_Bool IsObjSelected( const SdrObject& rObj ) const;
488 
489 	void EndTextEdit();				//Loescht ggf. das Objekt.
490 
491 	//Ankertyp des selektierten Objektes, -1 bei Uneindeutigkeit oder
492     //Rahmenselektion; FLY_AT_PAGE bzw. FLY_AT_PARA aus frmatr.hxx sonst.
493 	short GetAnchorId() const;
494 
495 	//Erzeugen von DrawObjekten, beim Begin wird der Objekttyp mitgegeben.
496 	//Beim End kann ein Cmd mitgegeben werden, hier ist ggf.
497 	//SDRCREATE_RESTRAINTEND fuer Ende oder SDRCREATE_NEXTPOINT fuer ein
498 	//Polygon relevant. Nach dem RESTRAINTEND ist das Objekt erzeugt und
499 	//selektiert.
500 	//Mit BreakCreate wird der Vorgang abgebrochen, dann ist kein Objekt
501 	//mehr selektiert.
502     sal_Bool BeginCreate( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, const Point &rPos );
503 	sal_Bool BeginCreate( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, sal_uInt32 eObjInventor, const Point &);
504 	void MoveCreate ( const Point &rPos );
505 	sal_Bool EndCreate	( sal_uInt16 eSdrCreateCmd );
506 	void BreakCreate();
507 	sal_Bool IsDrawCreate() const;
508     void CreateDefaultShape( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, const Rectangle& rRect, sal_uInt16 nSlotId);
509 
510 	// Funktionen f�r Rubberbox, um Draw-Objekte zu selektieren
511 	sal_Bool BeginMark( const Point &rPos );
512 	void MoveMark ( const Point &rPos );
513 	sal_Bool EndMark  ();
514 	void BreakMark();
515 
516 	//Gruppe erzeugen, aufloesen, nix bei Rahmenselektion.
517 	sal_Bool IsGroupSelected();		//Kann auch eine Mischselektion sein!
518 	void GroupSelection();		//Hinterher ist die Gruppe selektiert.
519 	void UnGroupSelection();	//Die Einzelobjekte sind Selektiert
520 								//Es koennen noch immer Gruppen dabei sein.
521 
522     // OD 27.06.2003 #108784# - change return type.
523     bool IsGroupAllowed() const;
524 
525 	void MirrorSelection( sal_Bool bHorizontal );	//Bei sal_False Vertikal
526 
527 	//frmatr.hxx. Hier kein enum wg. Abhaengigkeiten
528 	//Der sal_Bool ist nur fuer internen Gebrauch! Anker wird nur - anhand der
529 	//aktuellen Dokumentposition - neu gesetzt aber nicht umgesetzt.
530 	void ChgAnchor( int eAnchorId, sal_Bool bSameOnly = sal_False,
531 								   sal_Bool bPosCorr = sal_True );
532 
533     sal_Bool SetDrawingAttr( SfxItemSet &rSet );
534 
535     // hole die selectierten DrawObj als Grafik (MetaFile/Bitmap)
536 	// Return-Wert besagt ob konvertiert wurde!!
537 	sal_Bool GetDrawObjGraphic( sal_uLong nFmt, Graphic& rGrf ) const;
538 
539 	void Paste( SvStream& rStm, sal_uInt16 nAction, const Point* pPt = 0 );
540 	sal_Bool Paste( const Graphic &rGrf );
541 	sal_Bool Paste( SotDataObject& rObj, const Point& rPt );
542 
543 	sal_Bool IsAlignPossible() const;
544 	void SetCalcFieldValueHdl(Outliner* pOutliner);
545 
546 	void Insert(const String& rGrfName,
547 				const String& rFltName,
548 				const Graphic* pGraphic = 0,
549 				const SfxItemSet* pFlyAttrSet = 0,
550 				const SfxItemSet* pGrfAttrSet = 0,
551 				SwFrmFmt* = 0 );
552 
553     // Insertion of a drawing object which have to be already inserted in the DrawModel
554     void InsertDrawObj( SdrObject& rDrawObj,
555                         const Point& rInsertPosition );
556 
557 	sal_Bool ReplaceSdrObj( const String& rGrfName, const String& rFltName,
558 						const Graphic* pGrf = 0 );
559 
560 	// --> #i972#
561     // for starmath formulas anchored 'as char' it alignes it baseline to baseline
562     // changing the previous vertical orientation
563     void AlignFormulaToBaseline( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& xObj, SwFlyFrm * pFly = 0 );
564 
565     // aligns all formulas with anchor 'as char' to baseline
566     void AlignAllFormulasToBaseline();
567     // <--
568 
569 //------------------------------------------
570 
571 	//Auskunft ueber naechstliegenden Inhalt zum uebergebenen Point
572 	Point GetCntntPos( const Point& rPoint, sal_Bool bNext ) const;
573 
574     //convert document position into position relative to the current page
575     Point GetRelativePagePosition(const Point& rDocPos);
576 
577     //Layout-Selektion Hiden/Zeigen und aufruf an die CrsrSh weiterreichen.
578 	void ShLooseFcs();
579 	void ShGetFcs( sal_Bool bUpdate = sal_True );
580 
581 	//PageDescriptor-Schnittstelle
582 	void   ChgCurPageDesc( const SwPageDesc& );
583 	sal_uInt16 GetCurPageDesc( const sal_Bool bCalcFrm = sal_True ) const;
584     sal_uInt16 GetMousePageDesc( const Point &rPt ) const;
585     sal_uInt16 GetPageDescCnt() const;
586 	SwPageDesc* FindPageDescByName( const String& rName,
587 									sal_Bool bGetFromPool = sal_False,
588 									sal_uInt16* pPos = 0 );
589 
590 	const SwPageDesc& GetPageDesc( sal_uInt16 i ) const;
591 	void  ChgPageDesc( sal_uInt16 i, const SwPageDesc& );
592 	// if inside all selection only one PageDesc, return this.
593 	// Otherwise return 0 pointer
594 	const SwPageDesc* GetSelectedPageDescs() const;
595 
596 	const SwRect& GetAnyCurRect( CurRectType eType,
597 								 const Point* pPt = 0,
598                                  const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& =
599                                  ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >() ) const;
600 
601 	//Seitennummer der Seite in der der Point liegt, 0 wenn keine
602 	//getroffen ist.
603 	sal_uInt16 GetPageNumber( const Point &rPoint ) const;
604 	sal_Bool GetPageNumber( long nYPos, sal_Bool bAtCrsrPos, sal_uInt16& rPhyNum, sal_uInt16& rVirtNum, String &rDisplay ) const;
605 
606     SwFlyFrmFmt* InsertObject( const svt::EmbeddedObjectRef&,
607 				const SfxItemSet* pFlyAttrSet = 0,
608 				const SfxItemSet* pGrfAttrSet = 0,
609 				SwFrmFmt* = 0 );
610 	sal_Bool 	FinishOLEObj();								// Server wird beendet
611 
612 	//Attribute der Tabelle besorgen/setzen.
613 	void GetTblAttr( SfxItemSet & ) const;
614 	void SetTblAttr( const SfxItemSet & );
615 
616 	//Tabelle vollstaendig selektiert?
617 	sal_Bool HasWholeTabSelection() const;
618 	//Ist der Inhalt einer Tabellenzelle oder mindestens eine Tabellenzelle
619 	//vollstaendig selektiert ist
620 	sal_Bool HasBoxSelection() const;
621 
622 	sal_Bool InsertRow( sal_uInt16 nCnt, sal_Bool bBehind );
623 	sal_Bool InsertCol( sal_uInt16 nCnt, sal_Bool bBehind );  // 0 == am Ende
624 	sal_Bool DeleteCol();
625 	sal_Bool DeleteRow();
626 
627 	sal_Bool DeleteTblSel();		//Aktuelle Selektion, ggf. die ganze Tabelle.
628 
629 	sal_uInt16 MergeTab();			//Merged selektierte Tabellenteile zusammen
630 								//Fehler ueber enum zurueck
631     // Zelle Vertikal oder Horizontal splitten.
632     sal_Bool SplitTab( sal_Bool nVert = sal_True, sal_uInt16 nCnt = 1, sal_Bool bSameHeight = sal_False );
633 	sal_Bool Sort(const SwSortOptions&);	//Sortieren.
634 
635 	void SetRowHeight( const SwFmtFrmSize &rSz );
636 	//Der Pointer muss vom Aufrufer zerstoert werden wenn != 0
637 	void GetRowHeight( SwFmtFrmSize *&rpSz ) const;
638 
639     void SetRowSplit( const SwFmtRowSplit &rSz );
640     void GetRowSplit( SwFmtRowSplit *&rpSz ) const;
641 
642 	void   SetBoxAlign( sal_uInt16 nOrient );
643 	sal_uInt16 GetBoxAlign() const;			//USHRT_MAX fuer uneindeutig!
644 
645 	//Ausgleichen der Zeilenhoehen. Mit bTstOnly festellen ob mehr als eine
646 	//Zeile markiert ist.
647 	sal_Bool BalanceRowHeight( sal_Bool bTstOnly );
648 
649 	void SetTabBorders( const SfxItemSet& rSet );
650 	void GetTabBorders( 	  SfxItemSet& rSet) const;
651 	void SetTabLineStyle(const Color* pColor, sal_Bool bSetLine = sal_False, const SvxBorderLine* pBorderLine = NULL);
652 
653 	void SetTabBackground( const SvxBrushItem &rNew );
654 	void GetTabBackground( SvxBrushItem &rToFill ) const;
655 
656 	void SetBoxBackground( const SvxBrushItem &rNew );
657 	sal_Bool GetBoxBackground( SvxBrushItem &rToFill ) const; //sal_False uneindeutig
658 
659     void SetBoxDirection( const SvxFrameDirectionItem& rNew );
660     sal_Bool GetBoxDirection( SvxFrameDirectionItem& rToFill ) const; //sal_False uneindeutig
661 
662     void SetRowBackground( const SvxBrushItem &rNew );
663 	sal_Bool GetRowBackground( SvxBrushItem &rToFill ) const; //sal_False uneindeutig
664 
665     sal_uInt8 WhichMouseTabCol( const Point &rPt ) const;
666     void GetTabCols( SwTabCols &rToFill ) const; //Spalten- und Randinfo.
667     void SetTabCols( const SwTabCols &rNew, sal_Bool bCurRowOnly = sal_True );
668     void GetMouseTabCols( SwTabCols &rToFill, const Point &rPt ) const;
669 	void SetMouseTabCols( const SwTabCols &rNew, sal_Bool bCurRowOnly,
670                           const Point &rPt );
671 
672     // --> FME 2004-07-30 #i20126# Enhanced table selection
673     // pEnd will be used during MouseMove
674     bool SelTblRowCol( const Point& rPt, const Point* pEnd = 0, bool bRowDrag = false );
675     // <--
676 
677     // #i24134# adjustment of table rows via Ruler
678     void GetTabRows( SwTabCols &rToFill ) const;
679     void SetTabRows( const SwTabCols &rNew, sal_Bool bCurColOnly );
680     void GetMouseTabRows( SwTabCols &rToFill, const Point &rPt ) const;
681     void SetMouseTabRows( const SwTabCols &rNew, sal_Bool bCurColOnly, const Point &rPt );
682 
683     void ProtectCells();    //Falls eine Tabselektion besteht, wird sie ver-
684 							// nichtet, wenn der Cursor nicht in Readonly darf
685 	void UnProtectCells();	// auf die Tabellenselektin
686 	void UnProtectTbls();	//bei allen Tabellen in der Selektion den Schutz aufheben
687 	sal_Bool HasTblAnyProtection( const String* pTblName = 0,
688 								sal_Bool* pFullTblProtection = 0 );
689 	sal_Bool CanUnProtectCells() const;
690 
691     sal_uInt16 GetRowsToRepeat() const;
692     void SetRowsToRepeat( sal_uInt16 nNumOfRows );
693     sal_uInt16 GetVirtPageNum( const sal_Bool bCalcFrm = sal_True );
694     //returns the number of table rows currently selected
695     //if the selection start at the top of the table
696     sal_uInt16    GetRowSelectionFromTop() const;
697 
698     sal_Bool IsInRepeatedHeadline() const { return CheckHeadline( true ); }
699     sal_Bool IsInHeadline() const { return CheckHeadline( false ); }
700 
701 	//Stellt die Breiten der Zellen so ein, dass der Inhalt moeglichst
702 	//nicht umgebrochen werden muss.
703 	//bBalance sorgt fuer einen Ausgleich der markierten Spalten.
704 	void AdjustCellWidth( sal_Bool bBalance = sal_False );
705 	//Nicht erlaubt, wenn nur  leere Zellen selektiert sind.
706 	sal_Bool IsAdjustCellWidthAllowed( sal_Bool bBalance = sal_False ) const;
707 
708 	//Ausgleich der Zellenbreiten, mit bTstOnly feststellen, ob mehr als
709 	//eine Zelle markiert ist.
710 	sal_Bool BalanceCellWidth( sal_Bool bTstOnly );
711 
712 		// AutoFormat fuer die Tabelle/TabellenSelection
713 	sal_Bool SetTableAutoFmt( const SwTableAutoFmt& rNew );
714 		// Erfrage wie attributiert ist
715 	sal_Bool GetTableAutoFmt( SwTableAutoFmt& rGet );
716 		// aender eine  Zellenbreite/-Hoehe/Spaltenbreite/Zeilenhoehe
717 	sal_Bool SetColRowWidthHeight( sal_uInt16 eType, sal_uInt16 nDiff = 283 );
718 		// Autosumme
719 	sal_Bool GetAutoSum( String& rFml ) const;
720 
721 	//Phy:	Tatsaechliche Seitenanzahl.
722 	//Virt: Vom User evtl. gesetzten Offset mit einbeziehen.
723 	sal_uInt16	GetPhyPageNum();
724 
725 	// Setzt an der aktuellen Postion einen neuen Page Offset
726 	void SetNewPageOffset( sal_uInt16 nOffset );
727 	void SetPageOffset( sal_uInt16 nOffset );	//Aendert den letzten Page Offset
728 	sal_uInt16 GetPageOffset() const;			//Liefert den letzten Page Offset
729 
730 	//SS fuer Beschriftungen
731     void InsertLabel( const SwLabelType eType, const String &rTxt, const String& rSeparator,
732                       const String& rNumberSeparator,
733 					  const sal_Bool bBefore, const sal_uInt16 nId,
734                       const String& rCharacterStyle,
735                       const sal_Bool bCpyBrd = sal_True );
736 
737 	//Das Lineal will auch noch etwas von uns wissen.
738 	sal_uInt16 GetCurColNum( SwGetCurColNumPara* pPara = 0 ) const;	//0 == in keiner Spalte
739 	sal_uInt16 GetCurMouseColNum( const Point &rPt,
740 							SwGetCurColNumPara* pPara = 0 ) const;
741 	sal_uInt16 GetCurTabColNum() const;		//0 == in keiner Tabelle
742 	sal_uInt16 GetCurMouseTabColNum( const Point &rPt ) const;
743 	sal_uInt16 GetCurOutColNum( SwGetCurColNumPara* pPara = 0 ) const;	// aktuelle aeussere Spalte
744 
745     sal_Bool IsTableRightToLeft() const;
746     sal_Bool IsMouseTableRightToLeft( const Point &rPt ) const;
747     sal_Bool IsTableVertical() const;
748 
749     sal_Bool IsLastCellInRow() const;
750     // Die Breite des aktuellen Bereichs fuer Spaltendialog
751 	long GetSectionWidth( SwFmt& rFmt ) const;
752 
753     void GetConnectableFrmFmts
754     (SwFrmFmt & rFmt, const String & rReference, sal_Bool bSuccessors,
755      ::std::vector< String > & aPrevPageVec,
756      ::std::vector< String > & aThisPageVec,
757      ::std::vector< String > & aNextPageVec,
758      ::std::vector< String > & aRestVec);
759 
760     /** SwFEShell::GetShapeBackgrd
761 
762         OD 02.09.2002 for #102450#:
763         method determines background color of the page the selected drawing
764         object is on and returns this color.
765         If no color is found, because no drawing object is selected or ...,
766         color COL_BLACK (default color on constructing object of class Color)
767         is returned.
768 
769         @author OD
770 
771         @returns an object of class Color
772     */
773     const Color GetShapeBackgrd() const;
774 
775     /** Is default horizontal text direction for selected drawing object right-to-left
776 
777         OD 09.12.2002 #103045#
778         Because drawing objects only painted for each page only, the default
779         horizontal text direction of a drawing object is given by the corresponding
780         page property.
781 
782         @author OD
783 
784         @returns boolean, indicating, if the horizontal text direction of the
785         page, the selected drawing object is on, is right-to-left.
786     */
787     bool IsShapeDefaultHoriTextDirR2L() const;
788 
789     void ParkCursorInTab();
790 
791     // -> #i23726#
792     SwTxtNode * GetNumRuleNodeAtPos(const Point &rPot);
793     sal_Bool IsNumLabel( const Point &rPt, int nMaxOffset = -1 );
794     // <- #i23726#
795     // --> OD 2005-02-21 #i42921#
796     bool IsVerticalModeAtNdAndPos( const SwTxtNode& _rTxtNode,
797                                    const Point& _rDocPos ) const;
798     // <--
799 
800 };
801 
802 #endif
803