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 .
23 #include <rtl/ref.hxx>
24 #include "svx/svxdllapi.h"
25 #include <svx/svdglev.hxx>
27 #include <svx/selectioncontroller.hxx>
29 //************************************************************
30 // Vorausdeklarationen
31 //************************************************************
33 #include <boost/shared_ptr.hpp>
40 struct PasteOrDropInfos
;
42 namespace com
{ namespace sun
{ namespace star
{ namespace uno
{
47 class SelectionController
;
50 //************************************************************
52 //************************************************************
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
59 ////////////////////////////////////////////////////////////////////////////////////////////////////
60 ////////////////////////////////////////////////////////////////////////////////////////////////////
62 // @@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@ @@@@@@ @@ @@ @@ @@@@@ @@ @@
63 // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
64 // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
65 // @@ @@ @@@@@ @@ @@@@ @@ @@ @@ @@ @@@@@ @@ @@@@ @@@@@@@
66 // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
67 // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
68 // @@@@ @@@@@ @@@@ @@@@@ @@@@@ @@ @@ @ @@ @@@@@ @@ @@
70 // - Allgemeines Edit fuer objektspeziefische Eigenschaften
71 // - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
74 ////////////////////////////////////////////////////////////////////////////////////////////////////
75 ////////////////////////////////////////////////////////////////////////////////////////////////////
77 class SVX_DLLPUBLIC SdrObjEditView
: public SdrGlueEditView
79 friend class SdrPageView
;
80 friend class ImpSdrEditPara
;
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...
92 SdrPageView
* pMacroPV
;
95 Rectangle aTextEditArea
;
96 Rectangle aMinTextEditArea
;
97 Link aOldCalcFieldValueLink
; // Zum rufen des alten Handlers
100 sal_uInt16 nMacroTol
;
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;
109 rtl::Reference
< sdr::SelectionController
> mxSelectionController
;
110 rtl::Reference
< sdr::SelectionController
> mxLastSelectionController
;
113 SVX_DLLPRIVATE
void ImpClearVars();
116 OutlinerView
* ImpFindOutlinerView(Window
* pWin
) const;
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
, bool bNoPaint
, OutlinerView
* pGivenView
) const;
121 void ImpPaintOutlinerView(OutlinerView
& rOutlView
, const Rectangle
& rRect
, OutputDevice
& rTargetDevice
) const;
122 void ImpInvalidateOutlinerView(OutlinerView
& rOutlView
) const;
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();
129 // Handler fuer AutoGrowing Text bei aktivem Outliner
130 DECL_LINK(ImpOutlinerStatusEventHdl
,EditStatus
*);
131 DECL_LINK(ImpOutlinerCalcFieldValueHdl
,EditFieldInfo
*);
133 void ImpMacroUp(const Point
& rUpPos
);
134 void ImpMacroDown(const Point
& rDownPos
);
136 DECL_LINK( BeginPasteOrDropHdl
, PasteOrDropInfos
* );
137 DECL_LINK( EndPasteOrDropHdl
, PasteOrDropInfos
* );
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();
145 ////////////////////////////////////////////////////////////////////////////////////////////////////
146 // used to call the old ImpPaintOutlinerView. Will be replaced when the
147 // outliner will be displayed on the overlay in edit mode.
148 void TextEditDrawing(SdrPaintWindow
& rPaintWindow
) const;
150 // Actionhandling fuer Macromodus
151 virtual sal_Bool
IsAction() const;
152 virtual void MovAction(const Point
& rPnt
);
153 virtual void EndAction();
154 virtual void BrkAction();
155 virtual void BckAction();
156 virtual void TakeActionRect(Rectangle
& rRect
) const;
158 virtual void Notify(SfxBroadcaster
& rBC
, const SfxHint
& rHint
);
159 virtual void ModelHasChanged();
161 //************************************************************************
162 // TextEdit ueber einen Outliner
163 //************************************************************************
164 // QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
165 // editiert werden sollen. Default=TRUE. Persistent.
166 void SetQuickTextEditMode(sal_Bool bOn
) { bQuickTextEditMode
=bOn
; }
167 sal_Bool
IsQuickTextEditMode() const { return bQuickTextEditMode
; }
169 // Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
170 // angemeldete Win verwendet.
171 // Der Cursor des Fensters an dem Editiert wird wird bei
172 // SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
173 // Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
174 // Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
175 // Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
176 // Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
177 // nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
178 // spaeter via delete zerstoert (falls bDontDeleteOutliner=sal_False). Die
179 // SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
180 // dieser Instanz und ausserdem auch den StatusEventHdl.
181 // Ebenso kann eine spezifische OutlinerView vorgegeben werden.
183 virtual sal_Bool
SdrBeginTextEdit(SdrObject
* pObj
, SdrPageView
* pPV
= 0L, ::Window
* pWin
= 0L, sal_Bool bIsNewObj
= sal_False
,
184 SdrOutliner
* pGivenOutliner
= 0L, OutlinerView
* pGivenOutlinerView
= 0L,
185 sal_Bool bDontDeleteOutliner
= sal_False
, sal_Bool bOnlyOneView
= sal_False
, sal_Bool bGrabFocus
= sal_True
);
186 // bDontDeleteReally ist ein Spezialparameter fuer den Writer.
187 // Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
188 // nicht geloescht. Stattdessen gibt es dann einen Returncode
189 // SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
190 // der besagt, dass das Objekt geloescht werden sollte.
191 virtual SdrEndTextEditKind
SdrEndTextEdit(sal_Bool bDontDeleteReally
= sal_False
);
192 virtual bool IsTextEdit() const;
194 // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb der
195 // des Objektbereichs oder der OutlinerView liegt.
196 sal_Bool
IsTextEditHit(const Point
& rHit
, short nTol
) const;
198 // Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb des
199 // Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
201 sal_Bool
IsTextEditFrameHit(const Point
& rHit
) const;
203 // Bei aktiver Selektion, also zwischen MouseButtonDown und
204 // MouseButtonUp liefert diese Methode immer TRUE.
205 sal_Bool
IsTextEditInSelectionMode() const;
207 // Wer das z.Zt. im TextEdit befindliche Objekt braucht:
208 SdrObject
* GetTextEditObject() const { return mxTextEditObj
.get(); }
210 // info about TextEditPageView. Default is 0L.
211 virtual SdrPageView
* GetTextEditPageView() const;
213 // Das aktuelle Win des Outliners
214 Window
* GetTextEditWin() const { return pTextEditWin
; }
215 void SetTextEditWin(Window
* pWin
);
217 // An den hier abgeholten Outliner kann man schliesslich
218 // Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
219 // Undo/Redo rufen, etc.
220 const SdrOutliner
* GetTextEditOutliner() const { return pTextEditOutliner
; }
221 SdrOutliner
* GetTextEditOutliner() { return pTextEditOutliner
; }
222 const OutlinerView
* GetTextEditOutlinerView() const { return pTextEditOutlinerView
; }
223 OutlinerView
* GetTextEditOutlinerView() { return pTextEditOutlinerView
; }
225 virtual sal_Bool
KeyInput(const KeyEvent
& rKEvt
, Window
* pWin
);
226 virtual sal_Bool
MouseButtonDown(const MouseEvent
& rMEvt
, Window
* pWin
);
227 virtual sal_Bool
MouseButtonUp(const MouseEvent
& rMEvt
, Window
* pWin
);
228 virtual sal_Bool
MouseMove(const MouseEvent
& rMEvt
, Window
* pWin
);
229 virtual sal_Bool
Command(const CommandEvent
& rCEvt
, Window
* pWin
);
231 // #97766# make virtual to change implementation e.g. for SdOutlineView
232 virtual sal_uInt16
GetScriptType() const;
234 /* new interface src537 */
235 sal_Bool
GetAttributes(SfxItemSet
& rTargetSet
, sal_Bool bOnlyHardAttr
=sal_False
) const;
237 sal_Bool
SetAttributes(const SfxItemSet
& rSet
, sal_Bool bReplaceAll
);
238 SfxStyleSheet
* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
239 sal_Bool
SetStyleSheet(SfxStyleSheet
* pStyleSheet
, sal_Bool bDontRemoveHardAttr
);
241 // Intern: Beim Splitteraufziehen neue OutlinerView...
242 virtual void AddWindowToPaintView(OutputDevice
* pNewWin
);
243 virtual void DeleteWindowFromPaintView(OutputDevice
* pOldWin
);
245 sal_uInt16
GetSelectionLevel() const;
248 //************************************************************************
249 // Object-MacroModus (z.B. Rect als Button oder sowas):
250 //************************************************************************
251 // Persistent. Default TRUE. SvDraw wertet das Flag u.a. bei
252 // SdrView::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
253 // Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==sal_True).
254 void SetMacroMode(sal_Bool bOn
) { bMacroMode
=bOn
; }
255 sal_Bool
IsMacroMode() const { return bMacroMode
; }
256 sal_Bool
BegMacroObj(const Point
& rPnt
, short nTol
, SdrObject
* pObj
, SdrPageView
* pPV
, Window
* pWin
);
257 sal_Bool
BegMacroObj(const Point
& rPnt
, SdrObject
* pObj
, SdrPageView
* pPV
, Window
* pWin
) { return BegMacroObj(rPnt
,-2,pObj
,pPV
,pWin
); }
258 void MovMacroObj(const Point
& rPnt
);
260 sal_Bool
EndMacroObj();
261 sal_Bool
IsMacroObj() const { return pMacroObj
!=NULL
; }
262 sal_Bool
IsMacroObjDown() const { return bMacroDown
; }
264 /** fills the given any with a XTextCursor for the current text selection.
265 Leaves the any untouched if there currently is no text selected */
266 void getTextSelection( ::com::sun::star::uno::Any
& rSelection
);
268 virtual void MarkListHasChanged();
270 rtl::Reference
< sdr::SelectionController
> getSelectionController() const { return mxSelectionController
; }
272 /** returns true if the shape identified by its inventor and identifier supports format paint brush operation */
273 virtual bool SupportsFormatPaintbrush( sal_uInt32 nObjectInventor
, sal_uInt16 nObjectIdentifier
) const;
275 /** returns a format paint brush set from the current selection */
276 virtual bool TakeFormatPaintBrush( boost::shared_ptr
< SfxItemSet
>& rFormatSet
);
278 /** applies a format paint brush set from the current selection.
279 if bNoCharacterFormats is true, no character attributes are changed.
280 if bNoParagraphFormats is true, no paragraph attributes are changed.
282 virtual void ApplyFormatPaintBrush( SfxItemSet
& rFormatSet
, bool bNoCharacterFormats
, bool bNoParagraphFormats
);
284 /** helper function for selections with multiple SdrText for one SdrTextObj (f.e. tables ) */
285 void ApplyFormatPaintBrushToText( SfxItemSet
& rFormatSet
, SdrTextObj
& rTextObj
, SdrText
* pText
, bool bNoCharacterFormats
, bool bNoParagraphFormats
);
288 virtual void OnBeginPasteOrDrop( PasteOrDropInfos
* pInfos
);
289 virtual void OnEndPasteOrDrop( PasteOrDropInfos
* pInfos
);
293 #endif //_SVDEDXV_HXX
295 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */