xref: /AOO41X/main/svx/inc/svx/svdedxv.hxx (revision ca62e2c2083b5d0995f1245bad6c2edfb455fbec)
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