xref: /trunk/main/svx/inc/svx/svdedxv.hxx (revision 69ffbee1)
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 	OutlinerView* ImpFindOutlinerView(Window* pWin) const;
124 
125 	// Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
126 	// pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
127 	OutlinerView* ImpMakeOutlinerView(Window* pWin, sal_Bool bNoPaint, OutlinerView* pGivenView) const;
128 	void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect, OutputDevice& rTargetDevice) const;
129 	void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const;
130 
131 	// Feststellen, ob der gesamte Text markiert ist. Liefert auch sal_True wenn
132 	// kein Text vorhanden ist.
133 	sal_Bool ImpIsTextEditAllSelected() const;
134 	void ImpMakeTextCursorAreaVisible();
135 
136 	// Handler fuer AutoGrowing Text bei aktivem Outliner
137 	DECL_LINK(ImpOutlinerStatusEventHdl,EditStatus*);
138 	DECL_LINK(ImpOutlinerCalcFieldValueHdl,EditFieldInfo*);
139 
140     // link for EndTextEditHdl
141 	DECL_LINK(EndTextEditHdl, SdrUndoManager*);
142 
143     void ImpMacroUp(const Point& rUpPos);
144 	void ImpMacroDown(const Point& rDownPos);
145 
146    	DECL_LINK( BeginPasteOrDropHdl, PasteOrDropInfos* );
147 	DECL_LINK( EndPasteOrDropHdl, PasteOrDropInfos* );
148 
149 protected:
150 	// #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
151 	SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
152 	virtual ~SdrObjEditView();
153 
154 public:
155 	////////////////////////////////////////////////////////////////////////////////////////////////////
156 	// used to call the old ImpPaintOutlinerView. Will be replaced when the
157 	// outliner will be displayed on the overlay in edit mode.
158 	void TextEditDrawing(SdrPaintWindow& rPaintWindow) const;
159 
160 	// Actionhandling fuer Macromodus
161 	virtual sal_Bool IsAction() const;
162 	virtual void MovAction(const Point& rPnt);
163 	virtual void EndAction();
164 	virtual void BrkAction();
165 	virtual void BckAction();
166 	virtual void TakeActionRect(Rectangle& rRect) const;
167 
168 	virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
169 	virtual void ModelHasChanged();
170 
171 	//************************************************************************
172 	// TextEdit ueber einen Outliner
173 	//************************************************************************
174 	// QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
175 	// editiert werden sollen. Default=TRUE. Persistent.
176 	void SetQuickTextEditMode(sal_Bool bOn) { bQuickTextEditMode=bOn; }
177 	sal_Bool IsQuickTextEditMode() const { return bQuickTextEditMode; }
178 
179 	// Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
180 	// angemeldete Win verwendet.
181 	// Der Cursor des Fensters an dem Editiert wird wird bei
182 	// SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
183 	// Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
184 	// Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
185 	// Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
186 	// Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
187 	// nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
188 	// spaeter via delete zerstoert (falls bDontDeleteOutliner=sal_False). Die
189 	// SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
190 	// dieser Instanz und ausserdem auch den StatusEventHdl.
191 	// Ebenso kann eine spezifische OutlinerView vorgegeben werden.
192 
193 	virtual sal_Bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = 0L, ::Window* pWin = 0L, sal_Bool bIsNewObj = sal_False,
194 		SdrOutliner* pGivenOutliner = 0L, OutlinerView* pGivenOutlinerView = 0L,
195         sal_Bool bDontDeleteOutliner = sal_False, sal_Bool bOnlyOneView = sal_False, sal_Bool bGrabFocus = sal_True);
196 	// bDontDeleteReally ist ein Spezialparameter fuer den Writer.
197 	// Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
198 	// nicht geloescht. Stattdessen gibt es dann einen Returncode
199 	// SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
200 	// der besagt, dass das Objekt geloescht werden sollte.
201 	virtual SdrEndTextEditKind SdrEndTextEdit(sal_Bool bDontDeleteReally = sal_False);
202 	virtual bool IsTextEdit() const;
203 
204 	// sal_True=Es wird ein Textrahmen (OBJ_TEXT,OBJ_OUTLINETEXT,...) editiert
205 	// ansonsten handelt es sich um ein beschriftetes Zeichenobjekt, an dem
206 	// der Text ja bekanntlich hor. und vert. zentriert wird.
207 	sal_Bool IsTextEditFrame() const;
208 
209 	// Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb der
210 	// des Objektbereichs oder der OutlinerView liegt.
211 	sal_Bool IsTextEditHit(const Point& rHit, short nTol) const;
212 
213 	// Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb des
214 	// Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
215 	// umschliesst.
216 	sal_Bool IsTextEditFrameHit(const Point& rHit) const;
217 
218 	// Bei aktiver Selektion, also zwischen MouseButtonDown und
219 	// MouseButtonUp liefert diese Methode immer TRUE.
220 	sal_Bool IsTextEditInSelectionMode() const;
221 
222 	// Folgende Methode addiert einen passenden Offset zum MouseEvent
223 	// um diesen an den Outliner weiterzureichen.
224 	void AddTextEditOfs(MouseEvent& rMEvt) const;
225 
226 	// Wer das z.Zt. im TextEdit befindliche Objekt braucht:
227 	SdrObject* GetTextEditObject() const { return mxTextEditObj.get(); }
228 
229 	// info about TextEditPageView. Default is 0L.
230 	virtual SdrPageView* GetTextEditPageView() const;
231 
232 	// Das aktuelle Win des Outliners
233 	Window* GetTextEditWin() const { return pTextEditWin; }
234 	void SetTextEditWin(Window* pWin);
235 
236 	// An den hier abgeholten Outliner kann man schliesslich
237 	// Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
238 	// Undo/Redo rufen, etc.
239 	const SdrOutliner* GetTextEditOutliner() const { return pTextEditOutliner; }
240 	SdrOutliner* GetTextEditOutliner() { return pTextEditOutliner; }
241 	const OutlinerView* GetTextEditOutlinerView() const { return pTextEditOutlinerView; }
242 	OutlinerView* GetTextEditOutlinerView() { return pTextEditOutlinerView; }
243 
244 	virtual sal_Bool KeyInput(const KeyEvent& rKEvt, Window* pWin);
245 	virtual sal_Bool MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
246 	virtual sal_Bool MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
247 	virtual sal_Bool MouseMove(const MouseEvent& rMEvt, Window* pWin);
248 	virtual sal_Bool Command(const CommandEvent& rCEvt, Window* pWin);
249 	sal_Bool Cut(sal_uIntPtr nFormat=SDR_ANYFORMAT);
250 	sal_Bool Yank(sal_uIntPtr nFormat=SDR_ANYFORMAT);
251     sal_Bool Paste(Window* pWin=NULL, sal_uIntPtr nFormat=SDR_ANYFORMAT);
252 
253 	// #97766# make virtual to change implementation e.g. for SdOutlineView
254 	virtual sal_uInt16 GetScriptType() const;
255 
256 	/* new interface src537 */
257 	sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
258 
259 	sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
260 	SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
261 	sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
262 
263 	// Intern: Beim Splitteraufziehen neue OutlinerView...
264 	virtual void AddWindowToPaintView(OutputDevice* pNewWin);
265 	virtual void DeleteWindowFromPaintView(OutputDevice* pOldWin);
266 
267 	//************************************************************************
268 	// Object-MacroModus (z.B. Rect als Button oder sowas):
269 	//************************************************************************
270 	// Persistent. Default TRUE. SvDraw wertet das Flag u.a. bei
271 	// SdrView::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
272 	// Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==sal_True).
273 	void SetMacroMode(sal_Bool bOn) { bMacroMode=bOn; }
274 	sal_Bool IsMacroMode() const { return bMacroMode; }
275 	sal_Bool BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin);
276 	sal_Bool BegMacroObj(const Point& rPnt, SdrObject* pObj, SdrPageView* pPV, Window* pWin) { return BegMacroObj(rPnt,-2,pObj,pPV,pWin); }
277 	void MovMacroObj(const Point& rPnt);
278 	void BrkMacroObj();
279 	sal_Bool EndMacroObj();
280 	sal_Bool IsMacroObj() const { return pMacroObj!=NULL; }
281 	sal_Bool IsMacroObjDown() const { return bMacroDown; }
282 
283 	/** fills the given any with a XTextCursor for the current text selection.
284 		Leaves the any untouched if there currently is no text selected */
285 	void getTextSelection( ::com::sun::star::uno::Any& rSelection );
286 
287     virtual void MarkListHasChanged();
288 
289 	rtl::Reference< sdr::SelectionController > getSelectionController() const { return mxSelectionController; }
290 
291     /** returns true if the shape identified by its inventor and identifier supports format paint brush operation */
292     virtual bool SupportsFormatPaintbrush( sal_uInt32 nObjectInventor, sal_uInt16 nObjectIdentifier ) const;
293 
294 	/** returns a format paint brush set from the current selection */
295 	virtual bool TakeFormatPaintBrush( boost::shared_ptr< SfxItemSet >& rFormatSet  );
296 
297 	/** applies a format paint brush set from the current selection.
298 	    if bNoCharacterFormats is true, no character attributes are changed.
299 	    if bNoParagraphFormats is true, no paragraph attributes are changed.
300 	*/
301 	virtual void ApplyFormatPaintBrush( SfxItemSet& rFormatSet, bool bNoCharacterFormats, bool bNoParagraphFormats );
302 
303     /** helper function for selections with multiple SdrText for one SdrTextObj (f.e. tables ) */
304     void ApplyFormatPaintBrushToText( SfxItemSet& rFormatSet, SdrTextObj& rTextObj, SdrText* pText, bool bNoCharacterFormats, bool bNoParagraphFormats );
305 
306 protected:
307     virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfos );
308     virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfos );
309 
310 };
311 
312 #endif //_SVDEDXV_HXX
313 
314