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 _SVDEDXV_HXX
21 : #define _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 : //************************************************************
30 : // Vorausdeklarationen
31 : //************************************************************
32 :
33 : #include <boost/shared_ptr.hpp>
34 :
35 : class SdrOutliner;
36 : class OutlinerView;
37 : class EditStatus;
38 : class EditFieldInfo;
39 : class ImpSdrEditPara;
40 : struct PasteOrDropInfos;
41 :
42 : namespace com { namespace sun { namespace star { namespace uno {
43 : class Any;
44 : } } } }
45 :
46 : namespace sdr {
47 : class SelectionController;
48 : }
49 :
50 : //************************************************************
51 : // Defines
52 : //************************************************************
53 :
54 : enum SdrEndTextEditKind {SDRENDTEXTEDIT_UNCHANGED, // Textobjekt unveraendert
55 : SDRENDTEXTEDIT_CHANGED, // Textobjekt wurde geaendert
56 : SDRENDTEXTEDIT_DELETED, // Textobjekt implizit geloescht
57 : SDRENDTEXTEDIT_SHOULDBEDELETED}; // Fuer Writer: Textobjekt sollte geloescht werden
58 :
59 : ////////////////////////////////////////////////////////////////////////////////////////////////////
60 : ////////////////////////////////////////////////////////////////////////////////////////////////////
61 : //
62 : // @@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@ @@@@@@ @@ @@ @@ @@@@@ @@ @@
63 : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
64 : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
65 : // @@ @@ @@@@@ @@ @@@@ @@ @@ @@ @@ @@@@@ @@ @@@@ @@@@@@@
66 : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
67 : // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
68 : // @@@@ @@@@@ @@@@ @@@@@ @@@@@ @@ @@ @ @@ @@@@@ @@ @@
69 : //
70 : // - Allgemeines Edit fuer objektspeziefische Eigenschaften
71 : // - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
72 : // - Macromodus
73 : //
74 : ////////////////////////////////////////////////////////////////////////////////////////////////////
75 : ////////////////////////////////////////////////////////////////////////////////////////////////////
76 :
77 : class SVX_DLLPUBLIC SdrObjEditView: public SdrGlueEditView
78 : {
79 : friend class SdrPageView;
80 : friend class ImpSdrEditPara;
81 :
82 : protected:
83 : // TextEdit
84 : SdrObjectWeakRef mxTextEditObj; // Aktuell im TextEdit befindliches Obj
85 : SdrPageView* pTextEditPV;
86 : SdrOutliner* pTextEditOutliner; // Na eben der Outliner fuers TextEdit
87 : OutlinerView* pTextEditOutlinerView; // die aktuelle View des Outliners
88 : Window* pTextEditWin; // passendes Win zu pTextEditOutlinerView
89 : Cursor* pTextEditCursorMerker; // Zum Restaurieren des Cursors am jeweiligen Win
90 : ImpSdrEditPara* pEditPara; // Da hau' ich erstmal alles rein um kompatibel zu bleiben...
91 : SdrObject* pMacroObj;
92 : SdrPageView* pMacroPV;
93 : Window* pMacroWin;
94 :
95 : Rectangle aTextEditArea;
96 : Rectangle aMinTextEditArea;
97 : Link aOldCalcFieldValueLink; // Zum rufen des alten Handlers
98 : Point aMacroDownPos;
99 :
100 : sal_uInt16 nMacroTol;
101 :
102 : unsigned bTextEditDontDelete : 1; // Outliner und View bei SdrEndTextEdit nicht deleten (f. Rechtschreibpruefung)
103 : unsigned bTextEditOnlyOneView : 1; // Nur eine OutlinerView (f. Rechtschreibpruefung)
104 : unsigned bTextEditNewObj : 1; // Aktuell editiertes Objekt wurde gerade neu erzeugt
105 : unsigned bQuickTextEditMode : 1; // persistent(->CrtV). Default=TRUE
106 : unsigned bMacroMode : 1; // persistent(->CrtV). Default=TRUE
107 : unsigned bMacroDown : 1;
108 :
109 : rtl::Reference< sdr::SelectionController > mxSelectionController;
110 : rtl::Reference< sdr::SelectionController > mxLastSelectionController;
111 :
112 : private:
113 : SVX_DLLPRIVATE void ImpClearVars();
114 :
115 : protected:
116 : OutlinerView* ImpFindOutlinerView(Window* pWin) const;
117 :
118 : // Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
119 : // pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
120 : OutlinerView* ImpMakeOutlinerView(Window* pWin, sal_Bool bNoPaint, OutlinerView* pGivenView) const;
121 : void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect) const;
122 : void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const;
123 :
124 : // Feststellen, ob der gesamte Text markiert ist. Liefert auch sal_True wenn
125 : // kein Text vorhanden ist.
126 : sal_Bool ImpIsTextEditAllSelected() const;
127 : void ImpMakeTextCursorAreaVisible();
128 :
129 : // Handler fuer AutoGrowing Text bei aktivem Outliner
130 : DECL_LINK(ImpOutlinerStatusEventHdl,EditStatus*);
131 : DECL_LINK(ImpOutlinerCalcFieldValueHdl,EditFieldInfo*);
132 :
133 : void ImpMacroUp(const Point& rUpPos);
134 : void ImpMacroDown(const Point& rDownPos);
135 :
136 : DECL_LINK( BeginPasteOrDropHdl, PasteOrDropInfos* );
137 : DECL_LINK( EndPasteOrDropHdl, PasteOrDropInfos* );
138 :
139 : protected:
140 : // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
141 : SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
142 : virtual ~SdrObjEditView();
143 :
144 : public:
145 : // Actionhandling fuer Macromodus
146 : virtual sal_Bool IsAction() const;
147 : virtual void MovAction(const Point& rPnt);
148 : virtual void EndAction();
149 : virtual void BrkAction();
150 : virtual void BckAction();
151 : virtual void TakeActionRect(Rectangle& rRect) const;
152 :
153 : virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
154 : virtual void ModelHasChanged();
155 :
156 : //************************************************************************
157 : // TextEdit ueber einen Outliner
158 : //************************************************************************
159 : // QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
160 : // editiert werden sollen. Default=TRUE. Persistent.
161 0 : void SetQuickTextEditMode(sal_Bool bOn) { bQuickTextEditMode=bOn; }
162 0 : sal_Bool IsQuickTextEditMode() const { return bQuickTextEditMode; }
163 :
164 : // Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
165 : // angemeldete Win verwendet.
166 : // Der Cursor des Fensters an dem Editiert wird wird bei
167 : // SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
168 : // Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
169 : // Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
170 : // Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
171 : // Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
172 : // nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
173 : // spaeter via delete zerstoert (falls bDontDeleteOutliner=sal_False). Die
174 : // SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
175 : // dieser Instanz und ausserdem auch den StatusEventHdl.
176 : // Ebenso kann eine spezifische OutlinerView vorgegeben werden.
177 :
178 : virtual sal_Bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = 0L, ::Window* pWin = 0L, sal_Bool bIsNewObj = sal_False,
179 : SdrOutliner* pGivenOutliner = 0L, OutlinerView* pGivenOutlinerView = 0L,
180 : sal_Bool bDontDeleteOutliner = sal_False, sal_Bool bOnlyOneView = sal_False, sal_Bool bGrabFocus = sal_True);
181 : // bDontDeleteReally ist ein Spezialparameter fuer den Writer.
182 : // Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
183 : // nicht geloescht. Stattdessen gibt es dann einen Returncode
184 : // SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
185 : // der besagt, dass das Objekt geloescht werden sollte.
186 : virtual SdrEndTextEditKind SdrEndTextEdit(sal_Bool bDontDeleteReally = sal_False);
187 : virtual bool IsTextEdit() const;
188 :
189 : // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb der
190 : // des Objektbereichs oder der OutlinerView liegt.
191 : sal_Bool IsTextEditHit(const Point& rHit, short nTol) const;
192 :
193 : // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb des
194 : // Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
195 : // umschliesst.
196 : sal_Bool IsTextEditFrameHit(const Point& rHit) const;
197 :
198 : // Bei aktiver Selektion, also zwischen MouseButtonDown und
199 : // MouseButtonUp liefert diese Methode immer TRUE.
200 : sal_Bool IsTextEditInSelectionMode() const;
201 :
202 : // Wer das z.Zt. im TextEdit befindliche Objekt braucht:
203 0 : SdrObject* GetTextEditObject() const { return mxTextEditObj.get(); }
204 :
205 : // info about TextEditPageView. Default is 0L.
206 : virtual SdrPageView* GetTextEditPageView() const;
207 :
208 : // Das aktuelle Win des Outliners
209 : Window* GetTextEditWin() const { return pTextEditWin; }
210 : void SetTextEditWin(Window* pWin);
211 :
212 : // An den hier abgeholten Outliner kann man schliesslich
213 : // Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
214 : // Undo/Redo rufen, etc.
215 : const SdrOutliner* GetTextEditOutliner() const { return pTextEditOutliner; }
216 0 : SdrOutliner* GetTextEditOutliner() { return pTextEditOutliner; }
217 : const OutlinerView* GetTextEditOutlinerView() const { return pTextEditOutlinerView; }
218 81 : OutlinerView* GetTextEditOutlinerView() { return pTextEditOutlinerView; }
219 :
220 : virtual sal_Bool KeyInput(const KeyEvent& rKEvt, Window* pWin);
221 : virtual sal_Bool MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
222 : virtual sal_Bool MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
223 : virtual sal_Bool MouseMove(const MouseEvent& rMEvt, Window* pWin);
224 : virtual sal_Bool Command(const CommandEvent& rCEvt, Window* pWin);
225 :
226 : // #97766# make virtual to change implementation e.g. for SdOutlineView
227 : virtual sal_uInt16 GetScriptType() const;
228 :
229 : /* new interface src537 */
230 : sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
231 :
232 : sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
233 : SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
234 : sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
235 :
236 : // Intern: Beim Splitteraufziehen neue OutlinerView...
237 : virtual void AddWindowToPaintView(OutputDevice* pNewWin);
238 : virtual void DeleteWindowFromPaintView(OutputDevice* pOldWin);
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::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
245 : // Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==sal_True).
246 : void SetMacroMode(sal_Bool bOn) { bMacroMode=bOn; }
247 : sal_Bool IsMacroMode() const { return bMacroMode; }
248 : sal_Bool BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin);
249 0 : sal_Bool BegMacroObj(const Point& rPnt, SdrObject* pObj, SdrPageView* pPV, Window* pWin) { return BegMacroObj(rPnt,-2,pObj,pPV,pWin); }
250 : void MovMacroObj(const Point& rPnt);
251 : void BrkMacroObj();
252 : sal_Bool EndMacroObj();
253 : sal_Bool IsMacroObj() const { return pMacroObj!=NULL; }
254 : sal_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();
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 //_SVDEDXV_HXX
286 :
287 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|