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