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