blob: f359cd8a375d0065760a781482842647f72143be [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SVDEDXV_HXX
#define _SVDEDXV_HXX
#include <rtl/ref.hxx>
#include "svx/svxdllapi.h"
#include <svx/svdglev.hxx>
#include <svx/selectioncontroller.hxx>
//************************************************************
// Vorausdeklarationen
//************************************************************
#include <boost/shared_ptr.hpp>
class SdrOutliner;
class OutlinerView;
class EditStatus;
class EditFieldInfo;
class ImpSdrEditPara;
struct PasteOrDropInfos;
class SdrUndoManager;
namespace com { namespace sun { namespace star { namespace uno {
class Any;
} } } }
namespace sdr {
class SelectionController;
}
//************************************************************
// Defines
//************************************************************
enum SdrEndTextEditKind {SDRENDTEXTEDIT_UNCHANGED, // Textobjekt unveraendert
SDRENDTEXTEDIT_CHANGED, // Textobjekt wurde geaendert
SDRENDTEXTEDIT_DELETED, // Textobjekt implizit geloescht
SDRENDTEXTEDIT_SHOULDBEDELETED}; // Fuer Writer: Textobjekt sollte geloescht werden
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// @@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@ @@@@@@ @@ @@ @@ @@@@@ @@ @@
// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
// @@ @@ @@@@@ @@ @@@@ @@ @@ @@ @@ @@@@@ @@ @@@@ @@@@@@@
// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
// @@@@ @@@@@ @@@@ @@@@@ @@@@@ @@ @@ @ @@ @@@@@ @@ @@
//
// - Allgemeines Edit fuer objektspeziefische Eigenschaften
// - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
// - Macromodus
//
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
class SVX_DLLPUBLIC SdrObjEditView: public SdrGlueEditView
{
friend class SdrPageView;
friend class ImpSdrEditPara;
protected:
// TextEdit
SdrObjectWeakRef mxTextEditObj; // Aktuell im TextEdit befindliches Obj
SdrPageView* pTextEditPV;
SdrOutliner* pTextEditOutliner; // Na eben der Outliner fuers TextEdit
OutlinerView* pTextEditOutlinerView; // die aktuelle View des Outliners
Window* pTextEditWin; // passendes Win zu pTextEditOutlinerView
Cursor* pTextEditCursorMerker; // Zum Restaurieren des Cursors am jeweiligen Win
ImpSdrEditPara* pEditPara; // Da hau' ich erstmal alles rein um kompatibel zu bleiben...
SdrObject* pMacroObj;
SdrPageView* pMacroPV;
Window* pMacroWin;
Rectangle aTextEditArea;
Rectangle aMinTextEditArea;
Link aOldCalcFieldValueLink; // Zum rufen des alten Handlers
Point aMacroDownPos;
sal_uInt16 nMacroTol;
unsigned bTextEditDontDelete : 1; // Outliner und View bei SdrEndTextEdit nicht deleten (f. Rechtschreibpruefung)
unsigned bTextEditOnlyOneView : 1; // Nur eine OutlinerView (f. Rechtschreibpruefung)
unsigned bTextEditNewObj : 1; // Aktuell editiertes Objekt wurde gerade neu erzeugt
unsigned bQuickTextEditMode : 1; // persistent(->CrtV). Default=TRUE
unsigned bMacroMode : 1; // persistent(->CrtV). Default=TRUE
unsigned bMacroDown : 1;
rtl::Reference< sdr::SelectionController > mxSelectionController;
rtl::Reference< sdr::SelectionController > mxLastSelectionController;
private:
::svl::IUndoManager* mpOldTextEditUndoManager;
SVX_DLLPRIVATE void ImpClearVars();
protected:
// central method to get an SdrUndoManager for enhanced TextEdit. Default will
// try to return a dynamic_casted GetModel()->GetSdrUndoManager(). Applications
// which want to use this feature will need to overload this virtual method,
// provide their document UndoManager and derive it from SdrUndoManager.
virtual SdrUndoManager* getSdrUndoManagerForEnhancedTextEdit() const;
OutlinerView* ImpFindOutlinerView(Window* pWin) const;
// Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
// pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
OutlinerView* ImpMakeOutlinerView(Window* pWin, sal_Bool bNoPaint, OutlinerView* pGivenView) const;
void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect, OutputDevice& rTargetDevice) const;
void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const;
// Feststellen, ob der gesamte Text markiert ist. Liefert auch sal_True wenn
// kein Text vorhanden ist.
sal_Bool ImpIsTextEditAllSelected() const;
void ImpMakeTextCursorAreaVisible();
// Handler fuer AutoGrowing Text bei aktivem Outliner
DECL_LINK(ImpOutlinerStatusEventHdl,EditStatus*);
DECL_LINK(ImpOutlinerCalcFieldValueHdl,EditFieldInfo*);
// link for EndTextEditHdl
DECL_LINK(EndTextEditHdl, SdrUndoManager*);
void ImpMacroUp(const Point& rUpPos);
void ImpMacroDown(const Point& rDownPos);
DECL_LINK( BeginPasteOrDropHdl, PasteOrDropInfos* );
DECL_LINK( EndPasteOrDropHdl, PasteOrDropInfos* );
protected:
// #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
virtual ~SdrObjEditView();
public:
////////////////////////////////////////////////////////////////////////////////////////////////////
// used to call the old ImpPaintOutlinerView. Will be replaced when the
// outliner will be displayed on the overlay in edit mode.
void TextEditDrawing(SdrPaintWindow& rPaintWindow) const;
// Actionhandling fuer Macromodus
virtual sal_Bool IsAction() const;
virtual void MovAction(const Point& rPnt);
virtual void EndAction();
virtual void BrkAction();
virtual void BckAction();
virtual void TakeActionRect(Rectangle& rRect) const;
virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
virtual void ModelHasChanged();
//************************************************************************
// TextEdit ueber einen Outliner
//************************************************************************
// QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
// editiert werden sollen. Default=TRUE. Persistent.
void SetQuickTextEditMode(sal_Bool bOn) { bQuickTextEditMode=bOn; }
sal_Bool IsQuickTextEditMode() const { return bQuickTextEditMode; }
// Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
// angemeldete Win verwendet.
// Der Cursor des Fensters an dem Editiert wird wird bei
// SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
// Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
// Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
// Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
// Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
// nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
// spaeter via delete zerstoert (falls bDontDeleteOutliner=sal_False). Die
// SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
// dieser Instanz und ausserdem auch den StatusEventHdl.
// Ebenso kann eine spezifische OutlinerView vorgegeben werden.
virtual sal_Bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = 0L, ::Window* pWin = 0L, sal_Bool bIsNewObj = sal_False,
SdrOutliner* pGivenOutliner = 0L, OutlinerView* pGivenOutlinerView = 0L,
sal_Bool bDontDeleteOutliner = sal_False, sal_Bool bOnlyOneView = sal_False, sal_Bool bGrabFocus = sal_True);
// bDontDeleteReally ist ein Spezialparameter fuer den Writer.
// Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
// nicht geloescht. Stattdessen gibt es dann einen Returncode
// SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
// der besagt, dass das Objekt geloescht werden sollte.
virtual SdrEndTextEditKind SdrEndTextEdit(sal_Bool bDontDeleteReally = sal_False);
virtual bool IsTextEdit() const;
// sal_True=Es wird ein Textrahmen (OBJ_TEXT,OBJ_OUTLINETEXT,...) editiert
// ansonsten handelt es sich um ein beschriftetes Zeichenobjekt, an dem
// der Text ja bekanntlich hor. und vert. zentriert wird.
sal_Bool IsTextEditFrame() const;
// Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb der
// des Objektbereichs oder der OutlinerView liegt.
sal_Bool IsTextEditHit(const Point& rHit, short nTol) const;
// Diese Methode liefert sal_True, wenn der Punkt rHit innerhalb des
// Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
// umschliesst.
sal_Bool IsTextEditFrameHit(const Point& rHit) const;
// Bei aktiver Selektion, also zwischen MouseButtonDown und
// MouseButtonUp liefert diese Methode immer TRUE.
sal_Bool IsTextEditInSelectionMode() const;
// Folgende Methode addiert einen passenden Offset zum MouseEvent
// um diesen an den Outliner weiterzureichen.
void AddTextEditOfs(MouseEvent& rMEvt) const;
// Wer das z.Zt. im TextEdit befindliche Objekt braucht:
SdrObject* GetTextEditObject() const { return mxTextEditObj.get(); }
// info about TextEditPageView. Default is 0L.
virtual SdrPageView* GetTextEditPageView() const;
// Das aktuelle Win des Outliners
Window* GetTextEditWin() const { return pTextEditWin; }
void SetTextEditWin(Window* pWin);
// An den hier abgeholten Outliner kann man schliesslich
// Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
// Undo/Redo rufen, etc.
const SdrOutliner* GetTextEditOutliner() const { return pTextEditOutliner; }
SdrOutliner* GetTextEditOutliner() { return pTextEditOutliner; }
const OutlinerView* GetTextEditOutlinerView() const { return pTextEditOutlinerView; }
OutlinerView* GetTextEditOutlinerView() { return pTextEditOutlinerView; }
virtual sal_Bool KeyInput(const KeyEvent& rKEvt, Window* pWin);
virtual sal_Bool MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
virtual sal_Bool MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
virtual sal_Bool MouseMove(const MouseEvent& rMEvt, Window* pWin);
virtual sal_Bool Command(const CommandEvent& rCEvt, Window* pWin);
sal_Bool Cut(sal_uIntPtr nFormat=SDR_ANYFORMAT);
sal_Bool Yank(sal_uIntPtr nFormat=SDR_ANYFORMAT);
sal_Bool Paste(Window* pWin=NULL, sal_uIntPtr nFormat=SDR_ANYFORMAT);
// #97766# make virtual to change implementation e.g. for SdOutlineView
virtual sal_uInt16 GetScriptType() const;
/* new interface src537 */
sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
// Intern: Beim Splitteraufziehen neue OutlinerView...
virtual void AddWindowToPaintView(OutputDevice* pNewWin);
virtual void DeleteWindowFromPaintView(OutputDevice* pOldWin);
sal_uInt16 GetSelectionLevel() const;
//************************************************************************
// Object-MacroModus (z.B. Rect als Button oder sowas):
//************************************************************************
// Persistent. Default TRUE. SvDraw wertet das Flag u.a. bei
// SdrView::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
// Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==sal_True).
void SetMacroMode(sal_Bool bOn) { bMacroMode=bOn; }
sal_Bool IsMacroMode() const { return bMacroMode; }
sal_Bool BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin);
sal_Bool BegMacroObj(const Point& rPnt, SdrObject* pObj, SdrPageView* pPV, Window* pWin) { return BegMacroObj(rPnt,-2,pObj,pPV,pWin); }
void MovMacroObj(const Point& rPnt);
void BrkMacroObj();
sal_Bool EndMacroObj();
sal_Bool IsMacroObj() const { return pMacroObj!=NULL; }
sal_Bool IsMacroObjDown() const { return bMacroDown; }
/** fills the given any with a XTextCursor for the current text selection.
Leaves the any untouched if there currently is no text selected */
void getTextSelection( ::com::sun::star::uno::Any& rSelection );
virtual void MarkListHasChanged();
rtl::Reference< sdr::SelectionController > getSelectionController() const { return mxSelectionController; }
/** returns true if the shape identified by its inventor and identifier supports format paint brush operation */
virtual bool SupportsFormatPaintbrush( sal_uInt32 nObjectInventor, sal_uInt16 nObjectIdentifier ) const;
/** returns a format paint brush set from the current selection */
virtual bool TakeFormatPaintBrush( boost::shared_ptr< SfxItemSet >& rFormatSet );
/** applies a format paint brush set from the current selection.
if bNoCharacterFormats is true, no character attributes are changed.
if bNoParagraphFormats is true, no paragraph attributes are changed.
*/
virtual void ApplyFormatPaintBrush( SfxItemSet& rFormatSet, bool bNoCharacterFormats, bool bNoParagraphFormats );
/** helper function for selections with multiple SdrText for one SdrTextObj (f.e. tables ) */
void ApplyFormatPaintBrushToText( SfxItemSet& rFormatSet, SdrTextObj& rTextObj, SdrText* pText, bool bNoCharacterFormats, bool bNoParagraphFormats );
protected:
virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfos );
virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfos );
};
#endif //_SVDEDXV_HXX