xref: /trunk/main/svx/inc/svx/svdedxv.hxx (revision 766ce4d0)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _SVDEDXV_HXX
25 #define _SVDEDXV_HXX
26 
27 #include <rtl/ref.hxx>
28 #include "svx/svxdllapi.h"
29 #include <svx/svdglev.hxx>
30 
31 #include <svx/selectioncontroller.hxx>
32 
33 //************************************************************
34 //   Vorausdeklarationen
35 //************************************************************
36 
37 #include <boost/shared_ptr.hpp>
38 
39 class SdrOutliner;
40 class OutlinerView;
41 class EditStatus;
42 class EditFieldInfo;
43 class ImpSdrEditPara;
44 struct PasteOrDropInfos;
45 class SdrUndoManager;
46 
47 namespace com { namespace sun { namespace star { namespace uno {
48 	class Any;
49 } } } }
50 
51 namespace sdr {
52 	class SelectionController;
53 }
54 
55 //************************************************************
56 //   Defines
57 //************************************************************
58 
59 enum SdrEndTextEditKind {SDRENDTEXTEDIT_UNCHANGED, // Textobjekt unveraendert
60 						 SDRENDTEXTEDIT_CHANGED,   // Textobjekt wurde geaendert
61 						 SDRENDTEXTEDIT_DELETED,   // Textobjekt implizit geloescht
62 						 SDRENDTEXTEDIT_SHOULDBEDELETED}; // Fuer Writer: Textobjekt sollte geloescht werden
63 
64 ////////////////////////////////////////////////////////////////////////////////////////////////////
65 ////////////////////////////////////////////////////////////////////////////////////////////////////
66 //
67 //   @@@@  @@@@@  @@@@@@  @@@@@ @@@@@  @@ @@@@@@  @@ @@ @@ @@@@@ @@   @@
68 //  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@   @@
69 //  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@ @ @@
70 //  @@  @@ @@@@@      @@  @@@@  @@  @@ @@   @@    @@@@@ @@ @@@@  @@@@@@@
71 //  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@     @@@  @@ @@    @@@@@@@
72 //  @@  @@ @@  @@ @@  @@  @@    @@  @@ @@   @@     @@@  @@ @@    @@@ @@@
73 //   @@@@  @@@@@   @@@@   @@@@@ @@@@@  @@   @@      @   @@ @@@@@ @@   @@
74 //
75 // - Allgemeines Edit fuer objektspeziefische Eigenschaften
76 // - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
77 // - Macromodus
78 //
79 ////////////////////////////////////////////////////////////////////////////////////////////////////
80 ////////////////////////////////////////////////////////////////////////////////////////////////////
81 
82 class SVX_DLLPUBLIC SdrObjEditView: public SdrGlueEditView
83 {
84 	friend class				SdrPageView;
85 	friend class				ImpSdrEditPara;
86 
87 protected:
88 	// TextEdit
89 	SdrObjectWeakRef			mxTextEditObj;          // Aktuell im TextEdit befindliches Obj
90 	SdrPageView*				pTextEditPV;
91 	SdrOutliner*				pTextEditOutliner;     // Na eben der Outliner fuers TextEdit
92 	OutlinerView*				pTextEditOutlinerView; // die aktuelle View des Outliners
93 	Window*						pTextEditWin;          // passendes Win zu pTextEditOutlinerView
94 	Cursor*						pTextEditCursorMerker; // Zum Restaurieren des Cursors am jeweiligen Win
95 	ImpSdrEditPara*				pEditPara; // Da hau' ich erstmal alles rein um kompatibel zu bleiben...
96 	SdrObject*					pMacroObj;
97 	SdrPageView*				pMacroPV;
98 	Window*						pMacroWin;
99 
100 	Rectangle					aTextEditArea;
101 	Rectangle					aMinTextEditArea;
102 	Link						aOldCalcFieldValueLink; // Zum rufen des alten Handlers
103 	Point						aMacroDownPos;
104 
105 	sal_uInt16					nMacroTol;
106 
107 	unsigned					bTextEditDontDelete : 1;   // Outliner und View bei SdrEndTextEdit nicht deleten (f. Rechtschreibpruefung)
108 	unsigned					bTextEditOnlyOneView : 1;  // Nur eine OutlinerView (f. Rechtschreibpruefung)
109 	unsigned					bTextEditNewObj : 1;       // Aktuell editiertes Objekt wurde gerade neu erzeugt
110 	unsigned					bQuickTextEditMode : 1;    // persistent(->CrtV). Default=TRUE
111 	unsigned					bMacroMode : 1;            // persistent(->CrtV). Default=TRUE
112 	unsigned					bMacroDown : 1;
113 
114 	rtl::Reference< sdr::SelectionController > mxSelectionController;
115 	rtl::Reference< sdr::SelectionController > mxLastSelectionController;
116 
117 private:
118     ::svl::IUndoManager* mpOldTextEditUndoManager;
119 
120 	SVX_DLLPRIVATE void ImpClearVars();
121 
122 protected:
123     // central method to get an SdrUndoManager for enhanced TextEdit. Default will
124     // try to return a dynamic_casted GetModel()->GetSdrUndoManager(). Applications
125     // which want to use this feature will need to overload this virtual method,
126     // provide their document UndoManager and derive it from SdrUndoManager.
127     virtual SdrUndoManager* getSdrUndoManagerForEnhancedTextEdit() const;
128 
129 	OutlinerView* ImpFindOutlinerView(Window* pWin) const;
130 
131 	// Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
132 	// pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
133 	OutlinerView* ImpMakeOutlinerView(Window* pWin, sal_Bool bNoPaint, OutlinerView* pGivenView) const;
134 	void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect, OutputDevice& rTargetDevice) const;
135 	void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const;
136 
137 	// Feststellen, ob der gesamte Text markiert ist. Liefert auch sal_True wenn
138 	// kein Text vorhanden ist.
139 	sal_Bool ImpIsTextEditAllSelected() const;
140 	void ImpMakeTextCursorAreaVisible();
141 
142 	// Handler fuer AutoGrowing Text bei aktivem Outliner
143 	DECL_LINK(ImpOutlinerStatusEventHdl,EditStatus*);
144 	DECL_LINK(ImpOutlinerCalcFieldValueHdl,EditFieldInfo*);
145 
146     // link for EndTextEditHdl
147 	DECL_LINK(EndTextEditHdl, SdrUndoManager*);
148 
149     void ImpMacroUp(const Point& rUpPos);
150 	void ImpMacroDown(const Point& rDownPos);
151 
152    	DECL_LINK( BeginPasteOrDropHdl, PasteOrDropInfos* );
153 	DECL_LINK( EndPasteOrDropHdl, PasteOrDropInfos* );
154 
155 protected:
156 	// #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
157 	SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
158 	virtual ~SdrObjEditView();
159 
160 public:
161 	////////////////////////////////////////////////////////////////////////////////////////////////////
162 	// used to call the old ImpPaintOutlinerView. Will be replaced when the
163 	// outliner will be displayed on the overlay in edit mode.
164 	void TextEditDrawing(SdrPaintWindow& rPaintWindow) const;
165 
166 	// Actionhandling fuer Macromodus
167 	virtual sal_Bool IsAction() const;
168 	virtual void MovAction(const Point& rPnt);
169 	virtual void EndAction();
170 	virtual void BrkAction();
171 	virtual void BckAction();
172 	virtual void TakeActionRect(Rectangle& rRect) const;
173 
174 	virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
175 	virtual void ModelHasChanged();
176 
177 	//************************************************************************
178 	// TextEdit ueber einen Outliner
179 	//************************************************************************
180 	// QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
181 	// editiert werden sollen. Default=TRUE. Persistent.
SetQuickTextEditMode(sal_Bool bOn)182 	void SetQuickTextEditMode(sal_Bool bOn) { bQuickTextEditMode=bOn; }
IsQuickTextEditMode() const183 	sal_Bool IsQuickTextEditMode() const { return bQuickTextEditMode; }
184 
185 	// Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
186 	// angemeldete Win verwendet.
187 	// Der Cursor des Fensters an dem Editiert wird wird bei
188 	// SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
189 	// Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
190 	// Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
191 	// Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
192 	// Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
193 	// nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
194 	// spaeter via delete zerstoert (falls bDontDeleteOutliner=sal_False). Die
195 	// SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
196 	// dieser Instanz und ausserdem auch den StatusEventHdl.
197 	// Ebenso kann eine spezifische OutlinerView vorgegeben werden.
198 
199 	virtual sal_Bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = 0L, ::Window* pWin = 0L, sal_Bool bIsNewObj = sal_False,
200 		SdrOutliner* pGivenOutliner = 0L, OutlinerView* pGivenOutlinerView = 0L,
201         sal_Bool bDontDeleteOutliner = sal_False, sal_Bool bOnlyOneView = sal_False, sal_Bool bGrabFocus = sal_True);
202 	// bDontDeleteReally ist ein Spezialparameter fuer den Writer.
203 	// Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
204 	// nicht geloescht. Stattdessen gibt es dann einen Returncode
205 	// SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
206 	// der besagt, dass das Objekt geloescht werden sollte.
207 	virtual SdrEndTextEditKind SdrEndTextEdit(sal_Bool bDontDeleteReally = sal_False);
208 	virtual bool IsTextEdit() const;
209 
210 	// sal_True=Es wird ein Textrahmen (OBJ_TEXT,OBJ_OUTLINETEXT,...) editiert
211 	// ansonsten handelt es sich um ein beschriftetes Zeichenobjekt, an dem
212 	// der Text ja bekanntlich hor. und vert. zentriert wird.
213 	sal_Bool IsTextEditFrame() const;
214 
215 	// Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb der
216 	// des Objektbereichs oder der OutlinerView liegt.
217 	sal_Bool IsTextEditHit(const Point& rHit, short nTol) const;
218 
219 	// Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb des
220 	// Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
221 	// umschliesst.
222 	sal_Bool IsTextEditFrameHit(const Point& rHit) const;
223 
224 	// Bei aktiver Selektion, also zwischen MouseButtonDown und
225 	// MouseButtonUp liefert diese Methode immer TRUE.
226 	sal_Bool IsTextEditInSelectionMode() const;
227 
228 	// Folgende Methode addiert einen passenden Offset zum MouseEvent
229 	// um diesen an den Outliner weiterzureichen.
230 	void AddTextEditOfs(MouseEvent& rMEvt) const;
231 
232 	// Wer das z.Zt. im TextEdit befindliche Objekt braucht:
GetTextEditObject() const233 	SdrObject* GetTextEditObject() const { return mxTextEditObj.get(); }
234 
235 	// info about TextEditPageView. Default is 0L.
236 	virtual SdrPageView* GetTextEditPageView() const;
237 
238 	// Das aktuelle Win des Outliners
GetTextEditWin() const239 	Window* GetTextEditWin() const { return pTextEditWin; }
240 	void SetTextEditWin(Window* pWin);
241 
242 	// An den hier abgeholten Outliner kann man schliesslich
243 	// Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
244 	// Undo/Redo rufen, etc.
GetTextEditOutliner() const245 	const SdrOutliner* GetTextEditOutliner() const { return pTextEditOutliner; }
GetTextEditOutliner()246 	SdrOutliner* GetTextEditOutliner() { return pTextEditOutliner; }
GetTextEditOutlinerView() const247 	const OutlinerView* GetTextEditOutlinerView() const { return pTextEditOutlinerView; }
GetTextEditOutlinerView()248 	OutlinerView* GetTextEditOutlinerView() { return pTextEditOutlinerView; }
249 
250 	virtual sal_Bool KeyInput(const KeyEvent& rKEvt, Window* pWin);
251 	virtual sal_Bool MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
252 	virtual sal_Bool MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
253 	virtual sal_Bool MouseMove(const MouseEvent& rMEvt, Window* pWin);
254 	virtual sal_Bool Command(const CommandEvent& rCEvt, Window* pWin);
255 	sal_Bool Cut(sal_uIntPtr nFormat=SDR_ANYFORMAT);
256 	sal_Bool Yank(sal_uIntPtr nFormat=SDR_ANYFORMAT);
257     sal_Bool Paste(Window* pWin=NULL, sal_uIntPtr nFormat=SDR_ANYFORMAT);
258 
259 	// #97766# make virtual to change implementation e.g. for SdOutlineView
260 	virtual sal_uInt16 GetScriptType() const;
261 
262 	/* new interface src537 */
263 	sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
264 
265 	sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
266 	SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
267 	sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
268 
269 	// Intern: Beim Splitteraufziehen neue OutlinerView...
270 	virtual void AddWindowToPaintView(OutputDevice* pNewWin);
271 	virtual void DeleteWindowFromPaintView(OutputDevice* pOldWin);
272 
273 	sal_uInt16 GetSelectionLevel() const;
274 
275 
276 	//************************************************************************
277 	// Object-MacroModus (z.B. Rect als Button oder sowas):
278 	//************************************************************************
279 	// Persistent. Default TRUE. SvDraw wertet das Flag u.a. bei
280 	// SdrView::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
281 	// Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==sal_True).
SetMacroMode(sal_Bool bOn)282 	void SetMacroMode(sal_Bool bOn) { bMacroMode=bOn; }
IsMacroMode() const283 	sal_Bool IsMacroMode() const { return bMacroMode; }
284 	sal_Bool BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin);
BegMacroObj(const Point & rPnt,SdrObject * pObj,SdrPageView * pPV,Window * pWin)285 	sal_Bool BegMacroObj(const Point& rPnt, SdrObject* pObj, SdrPageView* pPV, Window* pWin) { return BegMacroObj(rPnt,-2,pObj,pPV,pWin); }
286 	void MovMacroObj(const Point& rPnt);
287 	void BrkMacroObj();
288 	sal_Bool EndMacroObj();
IsMacroObj() const289 	sal_Bool IsMacroObj() const { return pMacroObj!=NULL; }
IsMacroObjDown() const290 	sal_Bool IsMacroObjDown() const { return bMacroDown; }
291 
292 	/** fills the given any with a XTextCursor for the current text selection.
293 		Leaves the any untouched if there currently is no text selected */
294 	void getTextSelection( ::com::sun::star::uno::Any& rSelection );
295 
296     virtual void MarkListHasChanged();
297 
getSelectionController() const298 	rtl::Reference< sdr::SelectionController > getSelectionController() const { return mxSelectionController; }
299 
300     /** returns true if the shape identified by its inventor and identifier supports format paint brush operation */
301     virtual bool SupportsFormatPaintbrush( sal_uInt32 nObjectInventor, sal_uInt16 nObjectIdentifier ) const;
302 
303 	/** returns a format paint brush set from the current selection */
304 	virtual bool TakeFormatPaintBrush( boost::shared_ptr< SfxItemSet >& rFormatSet  );
305 
306 	/** applies a format paint brush set from the current selection.
307 	    if bNoCharacterFormats is true, no character attributes are changed.
308 	    if bNoParagraphFormats is true, no paragraph attributes are changed.
309 	*/
310 	virtual void ApplyFormatPaintBrush( SfxItemSet& rFormatSet, bool bNoCharacterFormats, bool bNoParagraphFormats );
311 
312     /** helper function for selections with multiple SdrText for one SdrTextObj (f.e. tables ) */
313     void ApplyFormatPaintBrushToText( SfxItemSet& rFormatSet, SdrTextObj& rTextObj, SdrText* pText, bool bNoCharacterFormats, bool bNoParagraphFormats );
314 
315 protected:
316     virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfos );
317     virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfos );
318 
319 };
320 
321 #endif //_SVDEDXV_HXX
322 
323