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 <svl/languageoptions.hxx>
25 #include <svx/svxdllapi.h>
26 #include <svx/svdglev.hxx>
27 #include <svx/selectioncontroller.hxx>
28 #include <editeng/editview.hxx>
36 struct PasteOrDropInfos
;
38 class TextChainCursorManager
;
40 namespace com::sun::star::uno
{
45 class SelectionController
;
48 enum class SdrEndTextEditKind
50 Unchanged
, // textobject unchanged
51 Changed
, // textobject changed
52 Deleted
, // textobject implicitly deleted
53 ShouldBeDeleted
// for writer: textobject should be deleted
56 // - general edit for objectspecific properties
57 // - textedit for all drawobjects, inherited from SdrTextObj
61 class SVXCORE_DLLPUBLIC SdrObjEditView
: public SdrGlueEditView
, public EditViewCallbacks
63 friend class SdrPageView
;
64 friend class ImpSdrEditPara
;
66 // Now derived from EditViewCallbacks and overriding these callbacks to
67 // allow own EditText visualization
68 virtual void EditViewInvalidate(const tools::Rectangle
& rRect
) override
;
69 virtual void EditViewSelectionChange() override
;
70 virtual OutputDevice
& EditViewOutputDevice() const override
;
71 virtual css::uno::Reference
<css::datatransfer::dnd::XDropTarget
> GetDropTarget() override
;
72 virtual void EditViewInputContext(const InputContext
& rInputContext
) override
;
73 virtual void EditViewCursorRect(const tools::Rectangle
& rRect
, int nExtTextInputWidth
) override
;
75 // The OverlayObjects used for visualizing active TextEdit (currently
76 // using TextEditOverlayObject, but not limited to it
77 sdr::overlay::OverlayObjectList maTEOverlayGroup
;
81 tools::WeakReference
<SdrTextObj
>
82 mxTextEditObj
; // current object in TextEdit
83 SdrPageView
* pTextEditPV
;
84 std::unique_ptr
<SdrOutliner
> pTextEditOutliner
; // outliner for the TextEdit
85 OutlinerView
* pTextEditOutlinerView
; // current view of the outliners
86 VclPtr
<vcl::Window
> pTextEditWin
; // matching window to pTextEditOutlinerView
87 vcl::Cursor
* pTextEditCursorBuffer
; // to restore the cursor in each window
89 SdrPageView
* pMacroPV
;
90 VclPtr
<vcl::Window
> pMacroWin
;
92 tools::Rectangle aTextEditArea
;
93 tools::Rectangle aMinTextEditArea
;
94 Link
<EditFieldInfo
*,void> aOldCalcFieldValueLink
; // for call the old handler
99 bool bTextEditDontDelete
: 1; // do not delete outliner and view of SdrEndTextEdit (f. spellchecking)
100 bool bTextEditOnlyOneView
: 1; // a single OutlinerView (f. spellchecking)
101 bool bTextEditNewObj
: 1; // current edited object was just recreated
102 bool bQuickTextEditMode
: 1; // persistent(->CrtV). Default=TRUE
105 rtl::Reference
< sdr::SelectionController
> mxSelectionController
;
106 rtl::Reference
< sdr::SelectionController
> mxLastSelectionController
;
109 SfxUndoManager
* mpOldTextEditUndoManager
;
112 // central method to get an SdrUndoManager for enhanced TextEdit. Default will
113 // try to return a dynamic_casted GetModel()->GetSdrUndoManager(). Applications
114 // which want to use this feature will need to override this virtual method,
115 // provide their document UndoManager and derive it from SdrUndoManager.
116 virtual SdrUndoManager
* getSdrUndoManagerForEnhancedTextEdit() const;
118 void ImpMoveCursorAfterChainingEvent(TextChainCursorManager
*pCursorManager
);
119 TextChainCursorManager
*ImpHandleMotionThroughBoxesKeyInput(const KeyEvent
& rKEvt
, bool *bOutHandled
);
122 OutlinerView
* ImpFindOutlinerView(vcl::Window
const * pWin
) const;
124 // Create a new OutlinerView at the heap and initialize all required parameters.
125 // pTextEditObj, pTextEditPV and pTextEditOutliner have to be initialized
126 OutlinerView
* ImpMakeOutlinerView(vcl::Window
* pWin
, OutlinerView
* pGivenView
, SfxViewShell
* pViewShell
= nullptr) const;
127 void ImpPaintOutlinerView(OutlinerView
& rOutlView
, const tools::Rectangle
& rRect
, OutputDevice
& rTargetDevice
) const;
128 void ImpInvalidateOutlinerView(OutlinerView
const & rOutlView
) const;
131 void ImpChainingEventHdl();
132 DECL_LINK(ImpAfterCutOrPasteChainingEventHdl
, LinkParamNone
*, void);
135 // Check if the whole text is selected.
136 // Still returns sal_True if there is no text present.
137 bool ImpIsTextEditAllSelected() const;
138 void ImpMakeTextCursorAreaVisible();
140 // handler for AutoGrowing text with active Outliner
141 DECL_LINK(ImpOutlinerStatusEventHdl
, EditStatus
&, void);
142 DECL_LINK(ImpOutlinerCalcFieldValueHdl
, EditFieldInfo
*, void);
144 // link for EndTextEditHdl
145 DECL_LINK(EndTextEditHdl
, SdrUndoManager
*, void);
147 void ImpMacroUp(const Point
& rUpPos
);
148 void ImpMacroDown(const Point
& rDownPos
);
150 DECL_LINK( BeginPasteOrDropHdl
, PasteOrDropInfos
*, void );
151 DECL_LINK( EndPasteOrDropHdl
, PasteOrDropInfos
*, void );
154 // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
159 virtual ~SdrObjEditView() override
;
163 // used to call the old ImpPaintOutlinerView. Will be replaced when the
164 // outliner will be displayed on the overlay in edit mode.
165 void TextEditDrawing(SdrPaintWindow
& rPaintWindow
);
167 // Actionhandling for macromode
168 virtual bool IsAction() const override
;
169 virtual void MovAction(const Point
& rPnt
) override
;
170 virtual void EndAction() override
;
171 virtual void BrkAction() override
;
172 virtual void BckAction() override
;
173 virtual void TakeActionRect(tools::Rectangle
& rRect
) const override
;
175 SdrPageView
* ShowSdrPage(SdrPage
* pPage
) override
;
176 void HideSdrPage() override
;
178 virtual void Notify(SfxBroadcaster
& rBC
, const SfxHint
& rHint
) override
;
179 virtual void ModelHasChanged() override
;
182 // TextEdit over an outliner
184 // QuickTextEditMode = edit the text straight after selection. Default=TRUE. Persistent.
185 void SetQuickTextEditMode(bool bOn
) { bQuickTextEditMode
=bOn
; }
186 bool IsQuickTextEditMode() const { return bQuickTextEditMode
; }
188 // Start the TextEditMode. If pWin==NULL, use the first window, which is logged at the View.
189 // The cursor of the currently edited window is stored with SdrBeginTextEdit()
190 // and restored with SdrEndTextEdit().
191 // The app has to ensure, that the BegEdit of the window logged cursor is still valid,
192 // when SdrEndTextEdit is called.
193 // With the parameter pEditOutliner, the app has the possibility to specify his own outliner,
194 // which is used for editing. After the SdrBeginTextEdit call, the outliner belongs to
195 // SdrObjEditView, and is also later destroyed by this via delete (if bDontDeleteOutliner=sal_False).
196 // Afterwards the SdrObjEditView sets the modflag (EditEngine/Outliner) at this instance and also the
198 // Similarly a specific OutlinerView can be specified.
200 virtual bool SdrBeginTextEdit(SdrObject
* pObj
, SdrPageView
* pPV
= nullptr, vcl::Window
* pWin
= nullptr, bool bIsNewObj
= false,
201 SdrOutliner
* pGivenOutliner
= nullptr, OutlinerView
* pGivenOutlinerView
= nullptr,
202 bool bDontDeleteOutliner
= false, bool bOnlyOneView
= false, bool bGrabFocus
= true);
203 // bDontDeleteReally is a special parameter for writer
204 // If this flag is set, then a maybe empty textobject is not deleted.
205 // Instead you get a return code SdrEndTextEditKind::ShouldBeDeleted
206 // (in place of SDRENDTEXTEDIT_BEDELETED), which says, the obj should be
208 virtual SdrEndTextEditKind
SdrEndTextEdit(bool bDontDeleteReally
= false);
209 virtual bool IsTextEdit() const final override
;
211 // This method returns sal_True, if the point rHit is inside the
212 // objectspace or the OutlinerView.
213 bool IsTextEditHit(const Point
& rHit
) const;
215 // This method returns sal_True, if the point rHit is inside the
216 // handle-thick frame, which surrounds the OutlinerView at TextFrames.
217 bool IsTextEditFrameHit(const Point
& rHit
) const;
219 // At active selection, between MouseButtonDown and
220 // MouseButtonUp, this method always returns TRUE.
221 bool IsTextEditInSelectionMode() const;
223 // If sb needs the object out of the TextEdit:
224 SdrTextObj
* GetTextEditObject() const { return mxTextEditObj
.get(); }
226 // info about TextEditPageView. Default is 0L.
227 SdrPageView
* GetTextEditPageView() const;
229 // Current window of the outliners.
230 void SetTextEditWin(vcl::Window
* pWin
);
232 // Now at this outliner, events can be send, attributes can be set,
233 // call Cut/Copy/Paste, call Undo/Redo, and so on...
234 const SdrOutliner
* GetTextEditOutliner() const { return pTextEditOutliner
.get(); }
235 SdrOutliner
* GetTextEditOutliner() { return pTextEditOutliner
.get(); }
236 const OutlinerView
* GetTextEditOutlinerView() const { return pTextEditOutlinerView
; }
237 OutlinerView
* GetTextEditOutlinerView() { return pTextEditOutlinerView
; }
239 virtual bool KeyInput(const KeyEvent
& rKEvt
, vcl::Window
* pWin
) override
;
240 virtual bool MouseButtonDown(const MouseEvent
& rMEvt
, OutputDevice
* pWin
) override
;
241 virtual bool MouseButtonUp(const MouseEvent
& rMEvt
, OutputDevice
* pWin
) override
;
242 virtual bool MouseMove(const MouseEvent
& rMEvt
, OutputDevice
* pWin
) override
;
243 virtual bool Command(const CommandEvent
& rCEvt
, vcl::Window
* pWin
) override
;
245 // #97766# make virtual to change implementation e.g. for SdOutlineView
246 virtual SvtScriptType
GetScriptType() const;
248 /* new interface src537 */
249 void GetAttributes(SfxItemSet
& rTargetSet
, bool bOnlyHardAttr
) const;
251 bool SetAttributes(const SfxItemSet
& rSet
, bool bReplaceAll
);
252 SfxStyleSheet
* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(bool& rOk) const;
253 void SetStyleSheet(SfxStyleSheet
* pStyleSheet
, bool bDontRemoveHardAttr
);
255 // Intern: at mounting new OutlinerView...
256 virtual void AddWindowToPaintView(OutputDevice
* pNewWin
, vcl::Window
* pWindow
) override
;
257 virtual void DeleteWindowFromPaintView(OutputDevice
* pOldWin
) override
;
259 sal_uInt16
GetSelectionLevel() const;
262 // Object MacroMode (e.g. rect as button or sth. like that):
264 void BegMacroObj(const Point
& rPnt
, short nTol
, SdrObject
* pObj
, SdrPageView
* pPV
, vcl::Window
* pWin
);
265 void BegMacroObj(const Point
& rPnt
, SdrObject
* pObj
, SdrPageView
* pPV
, vcl::Window
* pWin
) { BegMacroObj(rPnt
,-2,pObj
,pPV
,pWin
); }
266 void MovMacroObj(const Point
& rPnt
);
269 bool IsMacroObj() const { return pMacroObj
!=nullptr; }
271 /** fills the given any with a XTextCursor for the current text selection.
272 Leaves the any untouched if there currently is no text selected */
273 void getTextSelection( css::uno::Any
& rSelection
);
275 virtual void MarkListHasChanged() override
;
277 const rtl::Reference
< sdr::SelectionController
>& getSelectionController() const { return mxSelectionController
; }
279 /** returns true if the shape identified by its inventor and identifier supports format paint brush operation */
280 static bool SupportsFormatPaintbrush( SdrInventor nObjectInventor
, sal_uInt16 nObjectIdentifier
);
282 /** returns a format paint brush set from the current selection */
283 void TakeFormatPaintBrush( std::shared_ptr
< SfxItemSet
>& rFormatSet
);
285 /** applies a format paint brush set from the current selection.
286 if bNoCharacterFormats is true, no character attributes are changed.
287 if bNoParagraphFormats is true, no paragraph attributes are changed.
289 void ApplyFormatPaintBrush( SfxItemSet
& rFormatSet
, bool bNoCharacterFormats
, bool bNoParagraphFormats
);
291 /** helper function for selections with multiple SdrText for one SdrTextObj (f.e. tables ) */
292 static void ApplyFormatPaintBrushToText( SfxItemSet
const & rFormatSet
, SdrTextObj
& rTextObj
, SdrText
* pText
, bool bNoCharacterFormats
, bool bNoParagraphFormats
);
295 virtual void OnBeginPasteOrDrop( PasteOrDropInfos
* pInfo
);
296 virtual void OnEndPasteOrDrop( PasteOrDropInfos
* pInfo
);
300 #endif // INCLUDED_SVX_SVDEDXV_HXX
302 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */