1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_SVX_SVDEDXV_HXX
21 #define INCLUDED_SVX_SVDEDXV_HXX
23 #include <rtl/ref.hxx>
24 #include <svx/svxdllapi.h>
25 #include <svx/svdglev.hxx>
27 #include <svx/selectioncontroller.hxx>
29 #include <boost/shared_ptr.hpp>
36 struct PasteOrDropInfos
;
39 namespace com
{ namespace sun
{ namespace star
{ namespace uno
{
44 class SelectionController
;
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
52 ////////////////////////////////////////////////////////////////////////////////////////////////////
53 // - Allgemeines Edit fuer objektspeziefische Eigenschaften
54 // - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
56 ////////////////////////////////////////////////////////////////////////////////////////////////////
58 class SVX_DLLPUBLIC SdrObjEditView
: public SdrGlueEditView
60 friend class SdrPageView
;
61 friend class ImpSdrEditPara
;
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 Window
* pTextEditWin
; // passendes Win zu pTextEditOutlinerView
70 Cursor
* pTextEditCursorMerker
; // Zum Restaurieren des Cursors am jeweiligen Win
71 ImpSdrEditPara
* pEditPara
; // Da hau' ich erstmal alles rein um kompatibel zu bleiben...
73 SdrPageView
* pMacroPV
;
76 Rectangle aTextEditArea
;
77 Rectangle aMinTextEditArea
;
78 Link aOldCalcFieldValueLink
; // Zum rufen des alten Handlers
83 unsigned bTextEditDontDelete
: 1; // Outliner und View bei SdrEndTextEdit nicht deleten (f. Rechtschreibpruefung)
84 unsigned bTextEditOnlyOneView
: 1; // Nur eine OutlinerView (f. Rechtschreibpruefung)
85 unsigned bTextEditNewObj
: 1; // Aktuell editiertes Objekt wurde gerade neu erzeugt
86 unsigned bQuickTextEditMode
: 1; // persistent(->CrtV). Default=TRUE
87 unsigned bMacroMode
: 1; // persistent(->CrtV). Default=TRUE
88 unsigned bMacroDown
: 1;
90 rtl::Reference
< sdr::SelectionController
> mxSelectionController
;
91 rtl::Reference
< sdr::SelectionController
> mxLastSelectionController
;
94 ::svl::IUndoManager
* mpOldTextEditUndoManager
;
96 SVX_DLLPRIVATE
void ImpClearVars();
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;
105 OutlinerView
* ImpFindOutlinerView(Window
* pWin
) const;
107 // Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
108 // pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
109 OutlinerView
* ImpMakeOutlinerView(Window
* pWin
, bool bNoPaint
, OutlinerView
* pGivenView
) const;
110 void ImpPaintOutlinerView(OutlinerView
& rOutlView
, const Rectangle
& rRect
, OutputDevice
& rTargetDevice
) const;
111 void ImpInvalidateOutlinerView(OutlinerView
& rOutlView
) const;
113 // Feststellen, ob der gesamte Text markiert ist. Liefert auch sal_True wenn
114 // kein Text vorhanden ist.
115 sal_Bool
ImpIsTextEditAllSelected() const;
116 void ImpMakeTextCursorAreaVisible();
118 // Handler fuer AutoGrowing Text bei aktivem Outliner
119 DECL_LINK(ImpOutlinerStatusEventHdl
,EditStatus
*);
120 DECL_LINK(ImpOutlinerCalcFieldValueHdl
,EditFieldInfo
*);
122 // link for EndTextEditHdl
123 DECL_LINK(EndTextEditHdl
, SdrUndoManager
*);
125 void ImpMacroUp(const Point
& rUpPos
);
126 void ImpMacroDown(const Point
& rDownPos
);
128 DECL_LINK( BeginPasteOrDropHdl
, PasteOrDropInfos
* );
129 DECL_LINK( EndPasteOrDropHdl
, PasteOrDropInfos
* );
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();
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;
142 // Actionhandling fuer Macromodus
143 virtual sal_Bool
IsAction() const;
144 virtual void MovAction(const Point
& rPnt
);
145 virtual void EndAction();
146 virtual void BrkAction();
147 virtual void BckAction();
148 virtual void TakeActionRect(Rectangle
& rRect
) const;
150 virtual void Notify(SfxBroadcaster
& rBC
, const SfxHint
& rHint
);
151 virtual void ModelHasChanged();
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 void SetQuickTextEditMode(sal_Bool bOn
) { bQuickTextEditMode
=bOn
; }
159 sal_Bool
IsQuickTextEditMode() const { return bQuickTextEditMode
; }
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.
175 virtual sal_Bool
SdrBeginTextEdit(SdrObject
* pObj
, SdrPageView
* pPV
= 0L, ::Window
* pWin
= 0L, sal_Bool bIsNewObj
= sal_False
,
176 SdrOutliner
* pGivenOutliner
= 0L, OutlinerView
* pGivenOutlinerView
= 0L,
177 sal_Bool bDontDeleteOutliner
= sal_False
, sal_Bool bOnlyOneView
= sal_False
, sal_Bool bGrabFocus
= sal_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(sal_Bool bDontDeleteReally
= sal_False
);
184 virtual bool IsTextEdit() const;
186 // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb der
187 // des Objektbereichs oder der OutlinerView liegt.
188 sal_Bool
IsTextEditHit(const Point
& rHit
, short nTol
) const;
190 // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb des
191 // Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
193 sal_Bool
IsTextEditFrameHit(const Point
& rHit
) const;
195 // Bei aktiver Selektion, also zwischen MouseButtonDown und
196 // MouseButtonUp liefert diese Methode immer TRUE.
197 sal_Bool
IsTextEditInSelectionMode() const;
199 // Wer das z.Zt. im TextEdit befindliche Objekt braucht:
200 SdrObject
* GetTextEditObject() const { return mxTextEditObj
.get(); }
202 // info about TextEditPageView. Default is 0L.
203 virtual SdrPageView
* GetTextEditPageView() const;
205 // Das aktuelle Win des Outliners
206 Window
* GetTextEditWin() const { return pTextEditWin
; }
207 void SetTextEditWin(Window
* pWin
);
209 // An den hier abgeholten Outliner kann man schliesslich
210 // Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
211 // Undo/Redo rufen, etc.
212 const SdrOutliner
* GetTextEditOutliner() const { return pTextEditOutliner
; }
213 SdrOutliner
* GetTextEditOutliner() { return pTextEditOutliner
; }
214 const OutlinerView
* GetTextEditOutlinerView() const { return pTextEditOutlinerView
; }
215 OutlinerView
* GetTextEditOutlinerView() { return pTextEditOutlinerView
; }
217 virtual sal_Bool
KeyInput(const KeyEvent
& rKEvt
, Window
* pWin
);
218 virtual sal_Bool
MouseButtonDown(const MouseEvent
& rMEvt
, Window
* pWin
);
219 virtual sal_Bool
MouseButtonUp(const MouseEvent
& rMEvt
, Window
* pWin
);
220 virtual sal_Bool
MouseMove(const MouseEvent
& rMEvt
, Window
* pWin
);
221 virtual sal_Bool
Command(const CommandEvent
& rCEvt
, Window
* pWin
);
223 // #97766# make virtual to change implementation e.g. for SdOutlineView
224 virtual sal_uInt16
GetScriptType() const;
226 /* new interface src537 */
227 sal_Bool
GetAttributes(SfxItemSet
& rTargetSet
, sal_Bool bOnlyHardAttr
=sal_False
) const;
229 sal_Bool
SetAttributes(const SfxItemSet
& rSet
, sal_Bool bReplaceAll
);
230 SfxStyleSheet
* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
231 sal_Bool
SetStyleSheet(SfxStyleSheet
* pStyleSheet
, sal_Bool bDontRemoveHardAttr
);
233 // Intern: Beim Splitteraufziehen neue OutlinerView...
234 virtual void AddWindowToPaintView(OutputDevice
* pNewWin
);
235 virtual void DeleteWindowFromPaintView(OutputDevice
* pOldWin
);
237 sal_uInt16
GetSelectionLevel() const;
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 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
);
252 sal_Bool
EndMacroObj();
253 sal_Bool
IsMacroObj() const { return pMacroObj
!=NULL
; }
254 sal_Bool
IsMacroObjDown() const { return bMacroDown
; }
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
);
260 virtual void MarkListHasChanged();
262 rtl::Reference
< sdr::SelectionController
> getSelectionController() const { return mxSelectionController
; }
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;
267 /** returns a format paint brush set from the current selection */
268 virtual bool TakeFormatPaintBrush( boost::shared_ptr
< SfxItemSet
>& rFormatSet
);
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.
274 virtual void ApplyFormatPaintBrush( SfxItemSet
& rFormatSet
, bool bNoCharacterFormats
, bool bNoParagraphFormats
);
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
);
280 virtual void OnBeginPasteOrDrop( PasteOrDropInfos
* pInfos
);
281 virtual void OnEndPasteOrDrop( PasteOrDropInfos
* pInfos
);
285 #endif // INCLUDED_SVX_SVDEDXV_HXX
287 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */