Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef _SVDEDXV_HXX
30 : : #define _SVDEDXV_HXX
31 : :
32 : : #include <rtl/ref.hxx>
33 : : #include "svx/svxdllapi.h"
34 : : #include <svx/svdglev.hxx>
35 : :
36 : : #include <svx/selectioncontroller.hxx>
37 : :
38 : : //************************************************************
39 : : // Vorausdeklarationen
40 : : //************************************************************
41 : :
42 : : #include <boost/shared_ptr.hpp>
43 : :
44 : : class SdrOutliner;
45 : : class OutlinerView;
46 : : class EditStatus;
47 : : class EditFieldInfo;
48 : : class ImpSdrEditPara;
49 : : struct PasteOrDropInfos;
50 : :
51 : : namespace com { namespace sun { namespace star { namespace uno {
52 : : class Any;
53 : : } } } }
54 : :
55 : : namespace sdr {
56 : : class SelectionController;
57 : : }
58 : :
59 : : //************************************************************
60 : : // Defines
61 : : //************************************************************
62 : :
63 : : enum SdrEndTextEditKind {SDRENDTEXTEDIT_UNCHANGED, // Textobjekt unveraendert
64 : : SDRENDTEXTEDIT_CHANGED, // Textobjekt wurde geaendert
65 : : SDRENDTEXTEDIT_DELETED, // Textobjekt implizit geloescht
66 : : SDRENDTEXTEDIT_SHOULDBEDELETED}; // Fuer Writer: Textobjekt sollte geloescht werden
67 : :
68 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
69 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
70 : : //
71 : : // @@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@ @@@@@@ @@ @@ @@ @@@@@ @@ @@
72 : : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
73 : : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
74 : : // @@ @@ @@@@@ @@ @@@@ @@ @@ @@ @@ @@@@@ @@ @@@@ @@@@@@@
75 : : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
76 : : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
77 : : // @@@@ @@@@@ @@@@ @@@@@ @@@@@ @@ @@ @ @@ @@@@@ @@ @@
78 : : //
79 : : // - Allgemeines Edit fuer objektspeziefische Eigenschaften
80 : : // - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
81 : : // - Macromodus
82 : : //
83 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
84 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
85 : :
86 : : class SVX_DLLPUBLIC SdrObjEditView: public SdrGlueEditView
87 : : {
88 : : friend class SdrPageView;
89 : : friend class ImpSdrEditPara;
90 : :
91 : : protected:
92 : : // TextEdit
93 : : SdrObjectWeakRef mxTextEditObj; // Aktuell im TextEdit befindliches Obj
94 : : SdrPageView* pTextEditPV;
95 : : SdrOutliner* pTextEditOutliner; // Na eben der Outliner fuers TextEdit
96 : : OutlinerView* pTextEditOutlinerView; // die aktuelle View des Outliners
97 : : Window* pTextEditWin; // passendes Win zu pTextEditOutlinerView
98 : : Cursor* pTextEditCursorMerker; // Zum Restaurieren des Cursors am jeweiligen Win
99 : : ImpSdrEditPara* pEditPara; // Da hau' ich erstmal alles rein um kompatibel zu bleiben...
100 : : SdrObject* pMacroObj;
101 : : SdrPageView* pMacroPV;
102 : : Window* pMacroWin;
103 : :
104 : : Rectangle aTextEditArea;
105 : : Rectangle aMinTextEditArea;
106 : : Link aOldCalcFieldValueLink; // Zum rufen des alten Handlers
107 : : Point aMacroDownPos;
108 : :
109 : : sal_uInt16 nMacroTol;
110 : :
111 : : unsigned bTextEditDontDelete : 1; // Outliner und View bei SdrEndTextEdit nicht deleten (f. Rechtschreibpruefung)
112 : : unsigned bTextEditOnlyOneView : 1; // Nur eine OutlinerView (f. Rechtschreibpruefung)
113 : : unsigned bTextEditNewObj : 1; // Aktuell editiertes Objekt wurde gerade neu erzeugt
114 : : unsigned bQuickTextEditMode : 1; // persistent(->CrtV). Default=TRUE
115 : : unsigned bMacroMode : 1; // persistent(->CrtV). Default=TRUE
116 : : unsigned bMacroDown : 1;
117 : :
118 : : rtl::Reference< sdr::SelectionController > mxSelectionController;
119 : : rtl::Reference< sdr::SelectionController > mxLastSelectionController;
120 : :
121 : : private:
122 : : SVX_DLLPRIVATE void ImpClearVars();
123 : :
124 : : protected:
125 : : OutlinerView* ImpFindOutlinerView(Window* pWin) const;
126 : :
127 : : // Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
128 : : // pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
129 : : OutlinerView* ImpMakeOutlinerView(Window* pWin, sal_Bool bNoPaint, OutlinerView* pGivenView) const;
130 : : void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect) const;
131 : : void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const;
132 : :
133 : : // Feststellen, ob der gesamte Text markiert ist. Liefert auch sal_True wenn
134 : : // kein Text vorhanden ist.
135 : : sal_Bool ImpIsTextEditAllSelected() const;
136 : : void ImpMakeTextCursorAreaVisible();
137 : :
138 : : // Handler fuer AutoGrowing Text bei aktivem Outliner
139 : : DECL_LINK(ImpOutlinerStatusEventHdl,EditStatus*);
140 : : DECL_LINK(ImpOutlinerCalcFieldValueHdl,EditFieldInfo*);
141 : :
142 : : void ImpMacroUp(const Point& rUpPos);
143 : : void ImpMacroDown(const Point& rDownPos);
144 : :
145 : : DECL_LINK( BeginPasteOrDropHdl, PasteOrDropInfos* );
146 : : DECL_LINK( EndPasteOrDropHdl, PasteOrDropInfos* );
147 : :
148 : : protected:
149 : : // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
150 : : SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
151 : : virtual ~SdrObjEditView();
152 : :
153 : : public:
154 : : // Actionhandling fuer Macromodus
155 : : virtual sal_Bool IsAction() const;
156 : : virtual void MovAction(const Point& rPnt);
157 : : virtual void EndAction();
158 : : virtual void BrkAction();
159 : : virtual void BckAction();
160 : : virtual void TakeActionRect(Rectangle& rRect) const;
161 : :
162 : : virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
163 : : virtual void ModelHasChanged();
164 : :
165 : : //************************************************************************
166 : : // TextEdit ueber einen Outliner
167 : : //************************************************************************
168 : : // QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
169 : : // editiert werden sollen. Default=TRUE. Persistent.
170 : 0 : void SetQuickTextEditMode(sal_Bool bOn) { bQuickTextEditMode=bOn; }
171 : 1510 : sal_Bool IsQuickTextEditMode() const { return bQuickTextEditMode; }
172 : :
173 : : // Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
174 : : // angemeldete Win verwendet.
175 : : // Der Cursor des Fensters an dem Editiert wird wird bei
176 : : // SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
177 : : // Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
178 : : // Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
179 : : // Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
180 : : // Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
181 : : // nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
182 : : // spaeter via delete zerstoert (falls bDontDeleteOutliner=sal_False). Die
183 : : // SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
184 : : // dieser Instanz und ausserdem auch den StatusEventHdl.
185 : : // Ebenso kann eine spezifische OutlinerView vorgegeben werden.
186 : :
187 : : virtual sal_Bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = 0L, ::Window* pWin = 0L, sal_Bool bIsNewObj = sal_False,
188 : : SdrOutliner* pGivenOutliner = 0L, OutlinerView* pGivenOutlinerView = 0L,
189 : : sal_Bool bDontDeleteOutliner = sal_False, sal_Bool bOnlyOneView = sal_False, sal_Bool bGrabFocus = sal_True);
190 : : // bDontDeleteReally ist ein Spezialparameter fuer den Writer.
191 : : // Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
192 : : // nicht geloescht. Stattdessen gibt es dann einen Returncode
193 : : // SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
194 : : // der besagt, dass das Objekt geloescht werden sollte.
195 : : virtual SdrEndTextEditKind SdrEndTextEdit(sal_Bool bDontDeleteReally = sal_False);
196 : : virtual bool IsTextEdit() const;
197 : :
198 : : // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb der
199 : : // des Objektbereichs oder der OutlinerView liegt.
200 : : sal_Bool IsTextEditHit(const Point& rHit, short nTol) const;
201 : :
202 : : // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb des
203 : : // Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
204 : : // umschliesst.
205 : : sal_Bool IsTextEditFrameHit(const Point& rHit) const;
206 : :
207 : : // Bei aktiver Selektion, also zwischen MouseButtonDown und
208 : : // MouseButtonUp liefert diese Methode immer TRUE.
209 : : sal_Bool IsTextEditInSelectionMode() const;
210 : :
211 : : // Wer das z.Zt. im TextEdit befindliche Objekt braucht:
212 : 432 : SdrObject* GetTextEditObject() const { return mxTextEditObj.get(); }
213 : :
214 : : // info about TextEditPageView. Default is 0L.
215 : : virtual SdrPageView* GetTextEditPageView() const;
216 : :
217 : : // Das aktuelle Win des Outliners
218 : : Window* GetTextEditWin() const { return pTextEditWin; }
219 : : void SetTextEditWin(Window* pWin);
220 : :
221 : : // An den hier abgeholten Outliner kann man schliesslich
222 : : // Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
223 : : // Undo/Redo rufen, etc.
224 : : const SdrOutliner* GetTextEditOutliner() const { return pTextEditOutliner; }
225 : 696 : SdrOutliner* GetTextEditOutliner() { return pTextEditOutliner; }
226 : : const OutlinerView* GetTextEditOutlinerView() const { return pTextEditOutlinerView; }
227 : 2112 : OutlinerView* GetTextEditOutlinerView() { return pTextEditOutlinerView; }
228 : :
229 : : virtual sal_Bool KeyInput(const KeyEvent& rKEvt, Window* pWin);
230 : : virtual sal_Bool MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
231 : : virtual sal_Bool MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
232 : : virtual sal_Bool MouseMove(const MouseEvent& rMEvt, Window* pWin);
233 : : virtual sal_Bool Command(const CommandEvent& rCEvt, Window* pWin);
234 : :
235 : : // #97766# make virtual to change implementation e.g. for SdOutlineView
236 : : virtual sal_uInt16 GetScriptType() const;
237 : :
238 : : /* new interface src537 */
239 : : sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
240 : :
241 : : sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
242 : : SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
243 : : sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
244 : :
245 : : // Intern: Beim Splitteraufziehen neue OutlinerView...
246 : : virtual void AddWindowToPaintView(OutputDevice* pNewWin);
247 : : virtual void DeleteWindowFromPaintView(OutputDevice* pOldWin);
248 : :
249 : : //************************************************************************
250 : : // Object-MacroModus (z.B. Rect als Button oder sowas):
251 : : //************************************************************************
252 : : // Persistent. Default TRUE. SvDraw wertet das Flag u.a. bei
253 : : // SdrView::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
254 : : // Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==sal_True).
255 : : void SetMacroMode(sal_Bool bOn) { bMacroMode=bOn; }
256 : : sal_Bool IsMacroMode() const { return bMacroMode; }
257 : : sal_Bool BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin);
258 : 0 : sal_Bool BegMacroObj(const Point& rPnt, SdrObject* pObj, SdrPageView* pPV, Window* pWin) { return BegMacroObj(rPnt,-2,pObj,pPV,pWin); }
259 : : void MovMacroObj(const Point& rPnt);
260 : : void BrkMacroObj();
261 : : sal_Bool EndMacroObj();
262 : : sal_Bool IsMacroObj() const { return pMacroObj!=NULL; }
263 : : sal_Bool IsMacroObjDown() const { return bMacroDown; }
264 : :
265 : : /** fills the given any with a XTextCursor for the current text selection.
266 : : Leaves the any untouched if there currently is no text selected */
267 : : void getTextSelection( ::com::sun::star::uno::Any& rSelection );
268 : :
269 : : virtual void MarkListHasChanged();
270 : :
271 : 0 : rtl::Reference< sdr::SelectionController > getSelectionController() const { return mxSelectionController; }
272 : :
273 : : /** returns true if the shape identified by its inventor and identifier supports format paint brush operation */
274 : : virtual bool SupportsFormatPaintbrush( sal_uInt32 nObjectInventor, sal_uInt16 nObjectIdentifier ) const;
275 : :
276 : : /** returns a format paint brush set from the current selection */
277 : : virtual bool TakeFormatPaintBrush( boost::shared_ptr< SfxItemSet >& rFormatSet );
278 : :
279 : : /** applies a format paint brush set from the current selection.
280 : : if bNoCharacterFormats is true, no character attributes are changed.
281 : : if bNoParagraphFormats is true, no paragraph attributes are changed.
282 : : */
283 : : virtual void ApplyFormatPaintBrush( SfxItemSet& rFormatSet, bool bNoCharacterFormats, bool bNoParagraphFormats );
284 : :
285 : : /** helper function for selections with multiple SdrText for one SdrTextObj (f.e. tables ) */
286 : : void ApplyFormatPaintBrushToText( SfxItemSet& rFormatSet, SdrTextObj& rTextObj, SdrText* pText, bool bNoCharacterFormats, bool bNoParagraphFormats );
287 : :
288 : : protected:
289 : : virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfos );
290 : : virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfos );
291 : :
292 : : };
293 : :
294 : : #endif //_SVDEDXV_HXX
295 : :
296 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|