LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/include/svx - svdobj.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 13 13 100.0 %
Date: 2013-07-09 Functions: 12 37 32.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       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/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      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 .
      18             :  */
      19             : 
      20             : #ifndef _SVDOBJ_HXX
      21             : #define _SVDOBJ_HXX
      22             : 
      23             : #include <memory>
      24             : #include <typeinfo>
      25             : #include <cppuhelper/weakref.hxx>
      26             : #include <vcl/mapmod.hxx>
      27             : #include <tools/string.hxx>
      28             : #include <tools/weakbase.hxx>
      29             : #include <svl/lstner.hxx>
      30             : #include <vcl/timer.hxx>
      31             : #include <svx/svdsob.hxx>
      32             : #include <svx/svdtypes.hxx> // fuer SdrLayerID
      33             : #include <svx/svdglue.hxx> // Klebepunkte
      34             : #include <svx/xdash.hxx>
      35             : #include <svx/xpoly.hxx>
      36             : #include <svx/xenum.hxx>
      37             : #include <vcl/bitmapex.hxx>
      38             : #include <svx/sdrobjectuser.hxx>
      39             : #include "svx/svxdllapi.h"
      40             : #include "svx/shapeproperty.hxx"
      41             : #include <svl/poolitem.hxx>
      42             : 
      43             : #include <boost/optional.hpp>
      44             : #include <boost/ptr_container/ptr_vector.hpp>
      45             : 
      46             : //************************************************************
      47             : //   Vorausdeklarationen
      48             : //************************************************************
      49             : 
      50             : class SfxBroadcaster;
      51             : class Pointer;
      52             : class AutoTimer;
      53             : class OutlinerParaObject;
      54             : class SdrOutliner;
      55             : class SdrDragStat;
      56             : class SdrHdl;
      57             : class SdrHdlList;
      58             : class SdrItemPool;
      59             : class SdrModel;
      60             : class SdrObjList;
      61             : class SdrObject;
      62             : class SdrPage;
      63             : class SdrPageView;
      64             : class SdrView;
      65             : class SfxItemSet;
      66             : class SfxSetItem;
      67             : class SfxStyleSheet;
      68             : class SfxUndoAction;
      69             : class XFillAttrSetItem;
      70             : class XLineAttrSetItem;
      71             : class SfxItemPool;
      72             : class PolyPolygon;
      73             : class SfxPoolItem;
      74             : class SdrVirtObj;
      75             : class SdrDragView;
      76             : 
      77             : namespace sdr
      78             : {
      79             :     namespace properties
      80             :     {
      81             :         class BaseProperties;
      82             :     } // end of namespace properties
      83             : } // end of namespace sdr
      84             : 
      85             : // #110094#
      86             : namespace sdr
      87             : {
      88             :     namespace contact
      89             :     {
      90             :         class ViewContact;
      91             :     } // end of namespace contact
      92             : } // end of namespace sdr
      93             : 
      94             : namespace svx
      95             : {
      96             :     class PropertyChangeNotifier;
      97             : }
      98             : 
      99             : //************************************************************
     100             : //   Defines
     101             : //************************************************************
     102             : 
     103             : enum SdrObjKind {OBJ_NONE       = 0,  // Abstraktes Objekt (SdrObject)
     104             :                  OBJ_GRUP       = 1,  // Objektgruppe
     105             :                  OBJ_LINE       = 2,  // Strecke
     106             :                  OBJ_RECT       = 3,  // Rechteck ww. mit runden Ecken
     107             :                  OBJ_CIRC       = 4,  // Kreis, Ellipse
     108             :                  OBJ_SECT       = 5,  // Kreissektor
     109             :                  OBJ_CARC       = 6,  // Kreisbogen
     110             :                  OBJ_CCUT       = 7,  // Kreisabschnitt
     111             :                  OBJ_POLY       = 8,  // Polygon, PolyPolygon
     112             :                  OBJ_PLIN       = 9,  // PolyLine
     113             :                  OBJ_PATHLINE   =10,  // Offene Bezierkurve
     114             :                  OBJ_PATHFILL   =11,  // Geschlossene Bezierkurve
     115             :                  OBJ_FREELINE   =12,  // Offene Freihandlinie
     116             :                  OBJ_FREEFILL   =13,  // Geschlossene Freihandlinie
     117             :                  OBJ_SPLNLINE   =14,  // Natuerlicher kubischer Spline          (ni)
     118             :                  OBJ_SPLNFILL   =15,  // Periodischer kubischer Spline          (ni)
     119             :                  OBJ_TEXT       =16,  // Textobjekt
     120             :                  OBJ_TEXTEXT    =17,  // Texterweiterungsrahmen                 (ni)
     121             :                  OBJ_wegFITTEXT,      // FitToSize-Text (alle Zeilen gleich)
     122             :                  OBJ_wegFITALLTEXT,   // FitToSize-Text (Zeilenweise)           (ni)
     123             :                  OBJ_TITLETEXT  =20,  // Titeltext. Spezial-Textobjekt fuer StarDraw
     124             :                  OBJ_OUTLINETEXT=21,  // OutlineText. Spezial-Textobjekt fuer StarDraw
     125             :                  OBJ_GRAF       =22,  // Fremdgrafik - (StarView Graphic)
     126             :                  OBJ_OLE2       =23,  // OLE-Objekt
     127             :                  OBJ_EDGE       =24,  // Verbindungsobjekt fuer Konnektoren
     128             :                  OBJ_CAPTION    =25,  // Legendenobjekt
     129             :                  OBJ_PATHPOLY   =26,  // Polygon/PolyPolygon dargestellt durch SdrPathObj
     130             :                  OBJ_PATHPLIN   =27,  // Polyline dargestellt durch SdrPathObj
     131             :                  OBJ_PAGE       =28,  // Objekt, das eine SdrPage darstellt
     132             :                  OBJ_MEASURE    =29,  // Bemassungsobjekt
     133             :                  OBJ_DUMMY      =30,  // Dummyobjekt zum speichern von Luecken (zur anschliessenden Wiederherstellung der Surrogate)
     134             :                  OBJ_FRAME      =31,  // staendig aktives OLE (PlugIn-Frame oder sowas)
     135             :                  OBJ_UNO        =32,  // Universal Network Object im SvDraw-Obj eingepackt
     136             :                  OBJ_CUSTOMSHAPE=33,  // CustomShape
     137             :                  OBJ_MEDIA      =34,  // Media shape
     138             :                  OBJ_TABLE      =35,  // Table
     139             :                  OBJ_MAXI};
     140             : 
     141             : enum SdrUserCallType {SDRUSERCALL_MOVEONLY,         // Nur verschoben, Groesse unveraendert
     142             :                       SDRUSERCALL_RESIZE,           // Groesse und evtl. auch Pos veraendert
     143             :                       SDRUSERCALL_CHGATTR,          // Attribute veraendert. Moeglicherweise neue Groesse wg. Linienbreite
     144             :                       SDRUSERCALL_DELETE,           // Obj gibt es gleich nicht mehr. Schon keine Attr mehr.
     145             :                       SDRUSERCALL_COPY,             // Zuweisungsoperator gerufen. Kann alles geaendert sein
     146             :                       SDRUSERCALL_INSERTED,         // In eine Objektliste (z.B. Page) eingefuegt
     147             :                       SDRUSERCALL_REMOVED,          // Aus der Objektliste entfernt
     148             :                       SDRUSERCALL_CHILD_MOVEONLY,   // Ein Child einer Gruppe hat sich veraendert
     149             :                       SDRUSERCALL_CHILD_RESIZE,     // Ein Child einer Gruppe hat sich veraendert
     150             :                       SDRUSERCALL_CHILD_CHGATTR,    // Ein Child einer Gruppe hat sich veraendert
     151             :                       SDRUSERCALL_CHILD_DELETE,     // Ein Child einer Gruppe hat sich veraendert
     152             :                       SDRUSERCALL_CHILD_COPY,       // Ein Child einer Gruppe hat sich veraendert
     153             :                       SDRUSERCALL_CHILD_INSERTED,   // Ein Child einer Gruppe hat sich veraendert
     154             :                       SDRUSERCALL_CHILD_REMOVED};   // Ein Child einer Gruppe hat sich veraendert
     155             : 
     156             : //************************************************************
     157             : //   Hilfsklasse SdrObjUserCall
     158             : //************************************************************
     159             : 
     160        2176 : class SVX_DLLPUBLIC SdrObjUserCall
     161             : {
     162             : public:
     163             :     TYPEINFO();
     164             :     virtual ~SdrObjUserCall();
     165             :     virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, const Rectangle& rOldBoundRect);
     166             : };
     167             : 
     168             : //************************************************************
     169             : //   Hilfsklasse SdrObjMacroHitRec
     170             : //************************************************************
     171             : 
     172             : class SVX_DLLPUBLIC SdrObjMacroHitRec
     173             : {
     174             : public:
     175             :     Point                       aPos;
     176             :     Point                       aDownPos;
     177             :     OutputDevice*               pOut;
     178             :     const SetOfByte*            pVisiLayer;
     179             :     const SdrPageView*          pPageView;
     180             :     sal_uInt16                  nTol;
     181             :     bool                        bDown;
     182             : 
     183             :     SdrObjMacroHitRec();
     184             : };
     185             : 
     186             : //************************************************************
     187             : //   Hilfsklasse SdrObjUserData
     188             : //
     189             : // Anwenderdaten an einem Zeichenobjekt, z.B. applikationsspezifische Daten.
     190             : // Jedes Zeichenobjekt kann beliebig viele dieser Records haben (SV-Liste).
     191             : // Wer hier Daten halten will, muss sich ableiten und auch an der Factory
     192             : // einen entsprechenden Link setzen.
     193             : //
     194             : //************************************************************
     195             : 
     196             : class SVX_DLLPUBLIC SdrObjUserData
     197             : {
     198             : protected:
     199             :     sal_uInt32                      nInventor;
     200             :     sal_uInt16                      nIdentifier;
     201             :     sal_uInt16                      nVersion;
     202             : 
     203             : private:
     204             :     SVX_DLLPRIVATE void operator=(const SdrObjUserData& rData);        // not implemented
     205             :     SVX_DLLPRIVATE bool operator==(const SdrObjUserData& rData) const; // not implemented
     206             :     SVX_DLLPRIVATE bool operator!=(const SdrObjUserData& rData) const; // not implemented
     207             : 
     208             : public:
     209             :     TYPEINFO();
     210             : 
     211             :     SdrObjUserData(sal_uInt32 nInv, sal_uInt16 nId, sal_uInt16 nVer);
     212             :     SdrObjUserData(const SdrObjUserData& rData);
     213             :     virtual ~SdrObjUserData();
     214             : 
     215             :     virtual SdrObjUserData* Clone(SdrObject* pObj1) const = 0; // #i71039# NULL -> 0
     216             :     sal_uInt32 GetInventor() const;
     217             :     sal_uInt16 GetId() const;
     218             : 
     219             :     virtual bool HasMacro (const SdrObject* pObj) const;
     220             :     virtual SdrObject* CheckMacroHit (const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
     221             :     virtual Pointer GetMacroPointer (const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
     222             :     virtual void PaintMacro (OutputDevice& rOut, const Rectangle& rDirtyRect, const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
     223             :     virtual bool DoMacro (const SdrObjMacroHitRec& rRec, SdrObject* pObj);
     224             :     virtual OUString GetMacroPopupComment(const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
     225             : };
     226             : 
     227             : //************************************************************
     228             : //   Hilfsklasse SdrObjUserDataList
     229             : //************************************************************
     230             : 
     231             : class SdrObjUserDataList
     232             : {
     233             :     typedef boost::ptr_vector<SdrObjUserData> ListType;
     234             :     ListType maList;
     235             : 
     236             : public:
     237             :     SdrObjUserDataList();
     238             :     ~SdrObjUserDataList();
     239             : 
     240             :     size_t GetUserDataCount() const;
     241             :     const SdrObjUserData* GetUserData(size_t nNum) const;
     242             :     SdrObjUserData* GetUserData(size_t nNum);
     243             :     void AppendUserData(SdrObjUserData* pData);
     244             :     void DeleteUserData(size_t nNum);
     245             : };
     246             : 
     247             : //************************************************************
     248             : //   Hilfsklasse SdrObjGeoData
     249             : //
     250             : // Alle geometrischen Daten eines beliebigen Objektes zur �bergabe an's Undo/Redo
     251             : //
     252             : //************************************************************
     253             : 
     254             : class SVX_DLLPUBLIC SdrObjGeoData
     255             : {
     256             : public:
     257             :     Rectangle                   aBoundRect;
     258             :     Point                       aAnchor;
     259             :     SdrGluePointList*           pGPL;
     260             :     bool                        bMovProt;
     261             :     bool                        bSizProt;
     262             :     bool                        bNoPrint;
     263             :     bool                        bClosedObj;
     264             :     bool                        mbVisible;
     265             :     SdrLayerID                  mnLayerID;
     266             : 
     267             : public:
     268             :     SdrObjGeoData();
     269             :     virtual ~SdrObjGeoData();
     270             : };
     271             : 
     272             : //************************************************************
     273             : //   Hilfsklasse SdrObjPlusData
     274             : //
     275             : // Bitsack fuer DrawObjekte
     276             : //
     277             : //************************************************************
     278             : 
     279             : class SdrObjPlusData
     280             : {
     281             :     friend class                SdrObject;
     282             : 
     283             :     SfxBroadcaster*             pBroadcast;    // Broadcaster, falls dieses Obj referenziert wird (bVirtObj=true). Auch fuer Konnektoren etc.
     284             :     SdrObjUserDataList*         pUserDataList; // applikationsspeziefische Daten
     285             :     SdrGluePointList*           pGluePoints;   // Klebepunkte zum Ankleben von Objektverbindern
     286             : 
     287             :     // #i68101#
     288             :     // object name, title and description
     289             :     OUString aObjName;
     290             :     OUString aObjTitle;
     291             :     OUString aObjDescription;
     292             : 
     293             : public:
     294             :     TYPEINFO();
     295             :     SdrObjPlusData();
     296             :     virtual ~SdrObjPlusData();
     297             :     virtual SdrObjPlusData* Clone(SdrObject* pObj1) const;
     298             : 
     299             :     void SetGluePoints(const SdrGluePointList& rPts);
     300             : };
     301             : 
     302             : //************************************************************
     303             : //   Hilfsklasse SdrObjTransformInfoRec
     304             : //
     305             : // gibt Auskunft ueber verschiedene Eigenschaften eines ZObjects
     306             : //
     307             : //************************************************************
     308             : 
     309             : class SVX_DLLPUBLIC SdrObjTransformInfoRec
     310             : {
     311             : public:
     312             :     bool bSelectAllowed : 1;     // false=Obj kann nicht selektiert werden
     313             :     bool bMoveAllowed : 1;       // false=Obj kann nicht verschoben werden
     314             :     bool bResizeFreeAllowed : 1; // false=Obj kann nicht frei resized werden
     315             :     bool bResizePropAllowed : 1; // false=Obj kann nichtmal proportional resized werden
     316             :     bool bRotateFreeAllowed : 1; // false=Obj kann nicht frei gedreht werden
     317             :     bool bRotate90Allowed : 1;   // false=Obj kann nichtmal im 90deg Raster gedreht werden
     318             :     bool bMirrorFreeAllowed : 1; // false=Obj kann nicht frei gespiegelt werden
     319             :     bool bMirror45Allowed : 1;   // false=Obj kann nichtmal ueber Achse im 45deg Raster gespiegelt werden
     320             :     bool bMirror90Allowed : 1;   // false=Obj kann ebenfalls nicht ueber Achse im 90deg Raster gespiegelt werden
     321             :     bool bTransparenceAllowed : 1; // false=Obj does not have an interactive transparence control
     322             :     bool bGradientAllowed : 1; // false=Obj dooes not have an interactive gradient control
     323             :     bool bShearAllowed : 1;      // false=Obj kann nicht verzerrt werden
     324             :     bool bEdgeRadiusAllowed : 1;
     325             :     bool bNoOrthoDesired : 1;    // true bei Rect; ... false bei BMP,MTF;
     326             :     bool bNoContortion : 1;      // false=Kein verzerren (bei Crook) moeglich (nur true bei PathObj und Gruppierten PathObjs)
     327             :     bool bCanConvToPath : 1;     // false=Keine Konvertierung in PathObj moeglich
     328             :     bool bCanConvToPoly : 1;     // false=Keine Konvertierung in PolyObj moeglich
     329             :     bool bCanConvToContour : 1;     // false=no conversion down to whole contour possible
     330             :     bool bCanConvToPathLineToArea : 1; // false=Keine Konvertierung in PathObj moeglich mit Wandlung von LineToArea
     331             :     bool bCanConvToPolyLineToArea : 1; // false=Keine Konvertierung in PolyObj moeglich mit Wandlung von LineToArea
     332             : 
     333             :     SdrObjTransformInfoRec();
     334             : };
     335             : 
     336             : ////////////////////////////////////////////////////////////////////////////////////////////////////
     337             : // Abstraktes DrawObject
     338             : ////////////////////////////////////////////////////////////////////////////////////////////////////
     339             : 
     340             : class SvxShape;
     341             : class SVX_DLLPUBLIC SdrObject: public SfxListener, public tools::WeakBase< SdrObject >
     342             : {
     343             : private:
     344             :     // ObjectUser section
     345             :     sdr::ObjectUserVector                                           maObjectUsers;
     346             : 
     347             : public:
     348             :     void AddObjectUser(sdr::ObjectUser& rNewUser);
     349             :     void RemoveObjectUser(sdr::ObjectUser& rOldUser);
     350             : 
     351             :     // BaseProperties section
     352             : private:
     353             :     sdr::properties::BaseProperties*                                mpProperties;
     354             : protected:
     355             :     virtual sdr::properties::BaseProperties* CreateObjectSpecificProperties();
     356             : public:
     357             :     virtual sdr::properties::BaseProperties& GetProperties() const;
     358             : 
     359             :     ///////////////////////////////////////////////////////////////////////////////
     360             :     // #110094# DrawContact section
     361             : private:
     362             :     sdr::contact::ViewContact*                                      mpViewContact;
     363             : protected:
     364             :     virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact();
     365             : public:
     366             :     sdr::contact::ViewContact& GetViewContact() const;
     367             : 
     368             :     // DrawContact support: Methods for handling Object changes
     369             :     void ActionChanged() const;
     370             : 
     371             : private:
     372             :     friend class                SdrObjListIter;
     373             :     friend class                SdrVirtObj;
     374             :     friend class                SdrRectObj;
     375             : 
     376             : protected:
     377             :     Rectangle                   aOutRect;     // umschliessendes Rechteck fuer Paint (inkl. LineWdt, ...)
     378             :     Point                       aAnchor;      // Ankerposition (Writer)
     379             :     Point                       aGridOffset;  // hack (Calc)
     380             :     SdrObjList*                 pObjList;     // Liste, in dem das Obj eingefuegt ist.
     381             :     SdrPage*                    pPage;
     382             :     SdrModel*                   pModel;
     383             :     SdrObjUserCall*             pUserCall;
     384             :     SdrObjPlusData*             pPlusData;    // Broadcaster, UserData, Konnektoren, ... (Das ist der Bitsack)
     385             : 
     386             :     sal_uInt32                  nOrdNum;      // Rangnummer des Obj in der Liste
     387             : 
     388             :     /** Position in the navigation order.  SAL_MAX_UINT32 when not used.
     389             :     */
     390             :     sal_uInt32                  mnNavigationPosition;
     391             :     SdrLayerID                  mnLayerID;
     392             : 
     393             :     // Objekt zeigt nur auf ein Anderes
     394             :     bool                        bVirtObj : 1;
     395             :     bool                        bSnapRectDirty : 1;
     396             :     bool                        bNetLock : 1;   // ni
     397             :     bool                        bInserted : 1;  // nur wenn true gibt's RepaintBroadcast & SetModify
     398             :     bool                        bGrouped : 1;   // Member eines GroupObjektes?
     399             : 
     400             :     // Die folgende Flags werden gestreamt
     401             :     bool                        bMovProt : 1; // If true, the position is protected
     402             :     bool                        bSizProt : 1; // If true, the size is protected
     403             :     bool                        bNoPrint : 1; // If true, the object is not printed.
     404             :     bool                        mbVisible : 1; // If false, the object is not visible on screen (but maybe on printer, depending on bNoprint
     405             :     // Wenn bEmptyPresObj true ist, handelt es sich um ein
     406             :     // Praesentationsobjekt, dem noch kein Inhalt zugewiesen
     407             :     // wurde. Default ist das Flag auf FALSE. Die Verwaltung
     408             :     // uebernimmt die Applikation. Im Zuweisungsoperator sowie
     409             :     // beim Clone wird das Flag nicht mitkopiert!
     410             :     // Das Flag ist persistent.
     411             :     bool                        bEmptyPresObj : 1;     // Leeres Praesentationsobjekt (Draw)
     412             : 
     413             :     // true=Objekt ist als Objekt der MasterPage nicht sichtbar
     414             :     bool                        bNotVisibleAsMaster : 1;
     415             : 
     416             :     // true=Es handelt sich hierbei um ein geschlossenes Objekt, also nicht Linie oder Kreisbogen ...
     417             :     bool                        bClosedObj : 1;
     418             : 
     419             :     bool                        bIsEdge : 1;
     420             :     bool                        bIs3DObj : 1;
     421             :     bool                        bMarkProt : 1;  // Markieren verboten. Persistent
     422             :     bool                        bIsUnoObj : 1;
     423             :     bool                        bNotMasterCachable : 1;
     424             : 
     425             :     // #i25616#
     426             :     bool                        mbLineIsOutsideGeometry : 1;
     427             : 
     428             :     // #i25616#
     429             :     bool                        mbSupportTextIndentingOnLineWidthChange : 1;
     430             : 
     431             :     // on import of OLE object from MS documents the BLIP size might be retrieved,
     432             :     // in this case the following member is initialized as nonempty rectangle
     433             :     Rectangle                   maBLIPSizeRectangle;
     434             : 
     435             :     // global static ItemPool for not-yet-insetred items
     436             : private:
     437             :     static SdrItemPool*         mpGlobalItemPool;
     438             :     boost::optional<double>                                         mnRelativeWidth;
     439             :     boost::optional<double>                                         mnRelativeHeight;
     440             : public:
     441             :     static SdrItemPool& GetGlobalDrawObjectItemPool();
     442           1 :     void SetRelativeWidth( double nValue ) { mnRelativeWidth.reset( nValue ); }
     443           1 :     void SetRelativeHeight( double nValue ) { mnRelativeHeight.reset( nValue ); }
     444         360 :     boost::optional<double> GetRelativeWidth( ) const { return mnRelativeWidth; }
     445         358 :     boost::optional<double> GetRelativeHeight( ) const { return mnRelativeHeight; }
     446             :     // evil calc grid/shape drawlayer syncing
     447       72699 :     Point GetGridOffset() const { return aGridOffset; }
     448         248 :     void SetGridOffset( const Point& rGridOffset ){ aGridOffset = rGridOffset; }
     449             : protected:
     450             :     void ImpDeleteUserData();
     451             :     SdrObjUserData* ImpGetMacroUserData() const;
     452             :     Rectangle ImpDragCalcRect(const SdrDragStat& rDrag) const;
     453             : 
     454             :     // Fuer GetDragComment
     455             :     void ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, OUString& rStr, sal_uInt16 nVal=0) const;
     456             : 
     457             :     void ImpForcePlusData();
     458             : 
     459             :     OUString GetWinkStr(long nWink, bool bNoDegChar = false) const;
     460             :     OUString GetMetrStr(long nVal, MapUnit eWantMap=MAP_MM, bool bNoUnitChars = false) const;
     461             : 
     462             :     // bNotMyself=true bedeutet: Nur die ObjList auf Dirty setzen, nicht mich.
     463             :     // Wird z.B. benoetigt fuer NbcMove, denn da movt man SnapRect und aOutRect
     464             :     // i.d.R. gleich mit um die Neuberechnung zu sparen.
     465             : public:
     466             :     virtual void SetRectsDirty(sal_Bool bNotMyself = false);
     467             : protected:
     468             : 
     469             :     // ueberladen, wenn man sich von SdrObjPlusData abgeleitet hat:
     470             :     virtual SdrObjPlusData* NewPlusData() const;
     471             : 
     472             : protected:
     473             :     // Diese 3 Methoden muss ein abgeleitetes Objekt ueberladen, wenn es eigene
     474             :     // geometrische Daten besitzt, die fuer den Undo-Fall gesichert werden
     475             :     // sollen. NewGeoData() erzeugt lediglich eine leere Instanz auf eine von
     476             :     // SdrObjGeoData abgeleitete Klasse.
     477             :     virtual SdrObjGeoData* NewGeoData() const;
     478             :     virtual void SaveGeoData(SdrObjGeoData& rGeo) const;
     479             :     virtual void RestGeoData(const SdrObjGeoData& rGeo);
     480             : 
     481             : protected:
     482             :     virtual ~SdrObject();
     483             : 
     484             : public:
     485             :     TYPEINFO();
     486             :     SdrObject();
     487             : 
     488             :     /** frees the SdrObject pointed to by the argument
     489             : 
     490             :         In case the object has an SvxShape, which has the ownership of the object, it
     491             :         is actually *not* deleted.
     492             :     */
     493             :     static  void    Free( SdrObject*& _rpObject );
     494             : 
     495             :     // This method is only for access from Property objects
     496             :     virtual void SetBoundRectDirty();
     497             : 
     498             :     virtual void SetObjList(SdrObjList* pNewObjList);
     499             :     SdrObjList* GetObjList() const;
     500             : 
     501             :     virtual void SetPage(SdrPage* pNewPage);
     502             :     SdrPage* GetPage() const;
     503             : 
     504             :     virtual void SetModel(SdrModel* pNewModel);
     505             :     SdrModel* GetModel() const;
     506             :     SdrItemPool* GetObjectItemPool() const;
     507             : 
     508             :     void AddListener(SfxListener& rListener);
     509             :     void RemoveListener(SfxListener& rListener);
     510             :     const SfxBroadcaster* GetBroadcaster() const;
     511             : 
     512             :     virtual void AddReference(SdrVirtObj& rVrtObj);
     513             :     virtual void DelReference(SdrVirtObj& rVrtObj);
     514             :     virtual sal_uInt32 GetObjInventor() const;
     515             :     virtual sal_uInt16 GetObjIdentifier() const;
     516             :     virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const;
     517             : 
     518             :     // Layer interface
     519             :     virtual SdrLayerID GetLayer() const;
     520             :     virtual void NbcSetLayer(SdrLayerID nLayer);
     521             :     virtual void SetLayer(SdrLayerID nLayer);
     522             :     // renaming GetLayerSet -> getMergedHierarchyLayerSet to make clear what happens here. rSet needs to be empty.
     523             :     virtual void getMergedHierarchyLayerSet(SetOfByte& rSet) const;
     524             : 
     525             :     // UserCall interface
     526             :     void SetUserCall(SdrObjUserCall* pUser);
     527             :     SdrObjUserCall* GetUserCall() const;
     528             :     void SendUserCall(SdrUserCallType eUserCall, const Rectangle& rBoundRect) const;
     529             : 
     530             :     // Ein solcher Referenzpunkt ist z.B. der Punkt eines Symbols, der
     531             :     // der beim Einfuegen des Symbols auf das Raster gefangen werden soll
     532             :     // oder der Fixpunkt eines Bildes innerhalb eines Animationsobjektes.
     533             :     virtual bool HasRefPoint() const;
     534             :     virtual Point GetRefPoint() const;
     535             :     virtual void SetRefPoint(const Point& rPnt);
     536             : 
     537             :     // #i68101#
     538             :     // An object may have a user-set Name (Get/SetName()), e.g SdrGrafObj, SdrObjGroup
     539             :     // or SdrOle2Obj.
     540             :     // It may also have a Title and a Description for accessibility purposes.
     541             :     void SetName(const OUString& rStr);
     542             :     OUString GetName() const;
     543             :     void SetTitle(const OUString& rStr);
     544             :     OUString GetTitle() const;
     545             :     void SetDescription(const OUString& rStr);
     546             :     OUString GetDescription() const;
     547             : 
     548             :     // Fuer Gruppenobjekte
     549             :     bool IsGroupObject() const;
     550             :     virtual SdrObjList* GetSubList() const;
     551             :     SdrObject* GetUpGroup() const;
     552             : 
     553             :     // Ueber die Objekt-Ordnungsnummer kann man feststellen, ob ein Objekt vor
     554             :     // oder hinter einem anderen liegt. Objekte mit kleinen Ordnungsnummern werden
     555             :     // zuerst gezeichnet, Objekte mit grossen Ordnungsnummern zuletzt.
     556             :     // Wird die Reihenfolge der Objekte in der Liste veraendert, so wird ein
     557             :     // Dirty-Flag gesetzt (an der Page). Beim naechsten SdrObject::GetOrdNum()
     558             :     // werden die Ordnungsnummer aller Objekte der Liste neu bestimmt.
     559             :     sal_uInt32 GetOrdNum() const;
     560             : 
     561             :     // Diese Methode sollte nur verwendet werden, wenn man ganz  genau weiss,
     562             :     // was man macht:
     563             :     sal_uInt32 GetOrdNumDirect() const;
     564             : 
     565             :     // Das Setzen der Ordnungsnummer sollte nur vom Model bzw. von der Page
     566             :     // geschehen.
     567             :     void SetOrdNum(sal_uInt32 nNum);
     568             : 
     569             :     /** Return the position in the navigation order for the called object.
     570             :         Note that this method may update the navigation position of the
     571             :         called and of other SdrObjects.  Therefore this method can not be
     572             :         const.
     573             :         @return
     574             :             If no navigation position has been explicitly defined then the
     575             :             result of GetOrdNum() is returned.
     576             :     */
     577             :     sal_uInt32 GetNavigationPosition (void);
     578             : 
     579             :     /** Set the position in the navigation position to the given value.
     580             :         This method is typically used only by the model after a change to
     581             :         the navigation order.
     582             :         This method does not change the navigation position of other
     583             :         objects.
     584             :         Use SdrObjList::SetObjectNavigationPosition() instead.
     585             :     */
     586             :     void SetNavigationPosition (const sal_uInt32 nPosition);
     587             : 
     588             :     // #111111#
     589             :     // To make clearer that this method may trigger RecalcBoundRect and thus may be
     590             :     // expensive and sometimes problematic (inside a bigger object change You will get
     591             :     // non-useful BoundRects sometimes) i rename that method from GetBoundRect() to
     592             :     // GetCurrentBoundRect().
     593             :     virtual const Rectangle& GetCurrentBoundRect() const;
     594             : 
     595             :     // #111111#
     596             :     // To have a possibility to get the last calculated BoundRect e.g for producing
     597             :     // the first rectangle for repaints (old and new need to be used) without forcing
     598             :     // a RecalcBoundRect (which may be problematical and expensive sometimes) i add here
     599             :     // a new method for accessing the last BoundRect.
     600             :     virtual const Rectangle& GetLastBoundRect() const;
     601             : 
     602             :     virtual void RecalcBoundRect();
     603             : 
     604             :     void BroadcastObjectChange() const;
     605             : 
     606             :     // Modified-Flag am Model setzen
     607             :     virtual void SetChanged();
     608             : 
     609             :     // Tooling for painting a single object to a OutputDevice. This will be needed as long
     610             :     // as not all painting is changed to use DrawContact objects.
     611             :     bool SingleObjectPainter(OutputDevice& rOut) const;
     612             :     bool LineGeometryUsageIsNecessary() const;
     613             : 
     614             :     /**
     615             :       Returns a copy of the object. Every inherited class must reimplement this (in class Foo
     616             :       it should be sufficient to do "virtual Foo* Clone() const { return CloneHelper< Foo >(); }".
     617             :       Note that this function uses operator= internally.
     618             :     */
     619             :     virtual SdrObject* Clone() const;
     620             :     /**
     621             :       Implemented mainly for the purposes of Clone().
     622             :     */
     623             :     SdrObject& operator=(const SdrObject& rObj);
     624             : 
     625             :     // TakeObjName...() ist fuer die Anzeige in der UI, z.B. "3 Rahmen selektiert".
     626             :     virtual void TakeObjNameSingul(String& rName) const;
     627             :     virtual void TakeObjNamePlural(String& rName) const;
     628             : 
     629             :     // Das Xor-Polygon wird von der View zu Draggen des Objektes benoetigt.
     630             :     // Alle Polygone innerhalb des PolyPolygon werden als PolyLine interpretiert.
     631             :     // Moechte man ein geschlossenes Polygon, so muss man es explizit schliessen.
     632             :     virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
     633             : 
     634             :     // Die Kontur fuer TextToContour
     635             :     virtual basegfx::B2DPolyPolygon TakeContour() const;
     636             : 
     637             :     // Ueber GetHdlCount gibt ein Objekt die Anzahl seiner Handles preis.
     638             :     // Im Normalfall werden dies 8 sein, bei einer Strecke 2. Bei Polygonobjekten
     639             :     // (Polygon,Spline,Bezier) kann die Handleanzahl wesentlich groesser werden.
     640             :     // Polygonobjekten wird ausserdem die Moeglichkeit eingeraeumt einen Punkt
     641             :     // eines selektierten Objekts zu selektieren. Das Handle dieses Punktes wird
     642             :     // dann durch einen Satz neuer Handles ausgetauscht (PlusHdl). Bei einem
     643             :     // Polygon wird das wohl ein einfacher Selektionshandle sein, bei einer
     644             :     // Bezierkurve dagegen koennen das schon bis zu 3 Handles werden (inkl Gewichte).
     645             :     // GetHdl() und GetPlusHdl() muessen Handleinstanzen mit new erzeugen!
     646             :     // Ein Objekt, das bei HasSpacialDrag() true liefert muss diese Methoden
     647             :     // zur Verfuegung stellen (inkl. FillHdlList).
     648             :     virtual sal_uInt32 GetHdlCount() const;
     649             :     virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const;
     650             :     virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const;
     651             :     virtual SdrHdl* GetPlusHdl(const SdrHdl& rHdl, sal_uInt32 nPlNum) const;
     652             :     virtual void AddToHdlList(SdrHdlList& rHdlList) const;
     653             : 
     654             :     // Die Standardtransformationen (Move,Resize,Rotate,Mirror,Shear) werden von der
     655             :     // View uebernommen (TakeXorPoly(),...).
     656             :     // Objektspeziefisches draggen wie z.B. Eckenradius bei Rechtecken,
     657             :     // Stuetzstellen bei Splines, Gewichte bei Bezierkurven und Pointer von
     658             :     // Labelobjekten muss vom Objekt selbst gehandled werden. Um das Model
     659             :     // Statusfrei zu halten werden die Statusdaten an der View gehalten und dem
     660             :     // Objekt dann uebergeben. EndDrag liefrt im Normalfall true fuer Erfolg.
     661             :     // false kann zurueckgegeben werden, wenn das Dragging das Objekt nicht
     662             :     // veraendert hat, wobei dir evtl. Tatsache das die Maus nicht bewegt wurde
     663             :     // bereits von der View abgefangen wird.
     664             :     virtual bool hasSpecialDrag() const;
     665             :     virtual bool beginSpecialDrag(SdrDragStat& rDrag) const;
     666             :     virtual bool applySpecialDrag(SdrDragStat& rDrag);
     667             :     virtual String getSpecialDragComment(const SdrDragStat& rDrag) const;
     668             :     virtual basegfx::B2DPolyPolygon getSpecialDragPoly(const SdrDragStat& rDrag) const;
     669             : 
     670             :     // FullDrag support. This is for standard interactions and for SdrObjOwn
     671             :     // support. If supportsFullDrag() returns true, getFullDragClone has to
     672             :     // return a cloned SdrObject (who's ownership it loses) at which modifications
     673             :     // like Move(), Scale(), etc or applySpecialDrag() will be executed. That
     674             :     // object will be visualized on overlay for full drag, but should not be
     675             :     // part of the model, thus not changing anything since it's only a temporary
     676             :     // helper object for interaction
     677             :     virtual bool supportsFullDrag() const;
     678             :     virtual SdrObject* getFullDragClone() const;
     679             : 
     680             :     // Jedes Objekt muss in der Lage sein sich selbst interaktiv zu erzeugen.
     681             :     // Beim MausDown wird zunaechst ein neues Objekt erzeugt und dann seine
     682             :     // BegCreate()-Methode gerufen. Bei jedem MausMode wird dann MovCreate
     683             :     // gerufen. BrkCreate() bedeutet, dass der User die interaktive Objekt-
     684             :     // erzeugung abgebrochen hat. EndCreate() wird gerufen beim MouseUp-Event.
     685             :     // Liefert EndCreate() ein true, so ist die Objekterzeugung abgeschlossen;
     686             :     // das Objekt wird in die entsprechende Liste eingefuegt. Andernfalls
     687             :     // (EndCreate()==false) gehe ich davon aus, dass weitere Punkte zur
     688             :     // Objekterzeugung notwendig sind (Polygon,...). Der Parameter eCmd
     689             :     // enthaelt die Anzahl der Mausklicks (so die App diese durchreicht).
     690             :     // BckCreate() -> Letztes EndCreate() rueckgaengig machen (z.B. letzten
     691             :     // Polygonpunkt wieder loeschen).
     692             :     // RetrunCode: true=Weiter gehts, false=Create dadurch abgebrochen.
     693             :     virtual bool BegCreate(SdrDragStat& rStat);
     694             :     virtual bool MovCreate(SdrDragStat& rStat); // TRUE=Xor muss repainted werden
     695             :     virtual bool EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd);
     696             :     virtual bool BckCreate(SdrDragStat& rStat);
     697             :     virtual void BrkCreate(SdrDragStat& rStat);
     698             : 
     699             :     // damit holt man sich den Pointer, der das Createn dieses Objekts symbolisiert
     700             :     virtual Pointer GetCreatePointer() const;
     701             : 
     702             :     // Polygon das waehrend des Erzeugens aufgezogen wird
     703             :     virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat& rDrag) const;
     704             : 
     705             :     // Die Methoden Move, Resize, Rotate, Mirror, Shear, SetSnapRect und
     706             :     // SetLogicRect rufen jeweils die entsprechenden Nbc-Methoden, versenden einen
     707             :     // Repaint-Broadcast und setzen den Modified-Status am Model. Abgeleitete
     708             :     // Objekte sollten i.d.R. nur die Nbc-Methoden ueberladen.
     709             :     // Nbc bedeutet: 'NoBroadcast'.
     710             :     virtual void NbcMove  (const Size& rSiz);
     711             :     virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact);
     712             :     virtual void NbcRotate(const Point& rRef, long nWink, double sn, double cs);
     713             :     virtual void NbcMirror(const Point& rRef1, const Point& rRef2);
     714             :     virtual void NbcShear (const Point& rRef, long nWink, double tn, bool bVShear);
     715             : 
     716             :     virtual void Move  (const Size& rSiz);
     717             :     virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bUnsetRelative = true);
     718             :     virtual void Rotate(const Point& rRef, long nWink, double sn, double cs);
     719             :     virtual void Mirror(const Point& rRef1, const Point& rRef2);
     720             :     virtual void Shear (const Point& rRef, long nWink, double tn, bool bVShear);
     721             : 
     722             :     // Die relative Position eines Zeichenobjektes ist die Entfernung der
     723             :     // linken oberen Eche des logisch umschliessenden Rechtecks (SnapRect)
     724             :     // zum Anker.
     725             :     virtual void NbcSetRelativePos(const Point& rPnt);
     726             :     virtual void SetRelativePos(const Point& rPnt);
     727             :     virtual Point GetRelativePos() const;
     728             :     void ImpSetAnchorPos(const Point& rPnt);
     729             :     virtual void NbcSetAnchorPos(const Point& rPnt);
     730             :     virtual void SetAnchorPos(const Point& rPnt);
     731             :     virtual const Point& GetAnchorPos() const;
     732             : 
     733             :     // Snap wird nicht auf dem BoundRect ausgefuehrt, sondern nach Moeglichkeit auf
     734             :     // logischen Koordinaten (also ohne Beruecksichtigung von Strichstaerke, ... ).
     735             :     // SetSnapRect() versucht das Objekt so hinzusizen, dass es in das uebergebene
     736             :     // Rect passt (ohne Strichstaerke, ...)
     737             :     virtual void RecalcSnapRect();
     738             :     virtual const Rectangle& GetSnapRect() const;
     739             :     virtual void SetSnapRect(const Rectangle& rRect);
     740             :     virtual void NbcSetSnapRect(const Rectangle& rRect);
     741             : 
     742             :     // Logic Rect: Beim Rect z.B. ohne Beruecksichtigung des Drehwinkels, Shear, ...
     743             :     virtual const Rectangle& GetLogicRect() const;
     744             :     virtual void SetLogicRect(const Rectangle& rRect);
     745             :     virtual void NbcSetLogicRect(const Rectangle& rRect);
     746             : 
     747             :     /** the defaul is to set the logic rect to the given rectangle rMaxRect. If the shape
     748             :         has an intrinsic aspect ratio it may set the logic rect so the aspect
     749             :         ratio is kept but still inside the rectangle rMaxRect.
     750             : 
     751             :         If bShrinkOnly is set to true, the size of the current logic rect will not
     752             :         be changed if it is smaller than the given rectangle rMaxRect. */
     753             :     virtual void AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly = false );
     754             : 
     755             :     // Drehwinkel und Shear
     756             :     virtual long GetRotateAngle() const;
     757             :     virtual long GetShearAngle(bool bVertical = false) const;
     758             : 
     759             :     // Zum Fangen von/auf ausgezeichneten Punkten eines Obj (Polygonpunkte,
     760             :     // Kreismittelpunkt, ...)
     761             :     virtual sal_uInt32 GetSnapPointCount() const;
     762             :     virtual Point GetSnapPoint(sal_uInt32 i) const;
     763             : 
     764             :     // Fuer Objekte, bei denen jeder einzelne Punkt verschoben werden kann,
     765             :     // z.B. Polygone, Polylines, Linien, ... . Bei diesen Objekten werden
     766             :     // Punkte selektiert (ggf. Mehrfachselektion), geloescht, eingefuegt,
     767             :     // als Mehrfachselektion verschoben und gedreht, ...
     768             :     // Nur solche Objekte koennen PlusHandles haben (z.B. die Gewichte an den
     769             :     // Bezierkurven.
     770             :     virtual sal_Bool IsPolyObj() const;
     771             :     virtual sal_uInt32 GetPointCount() const;
     772             :     virtual Point GetPoint(sal_uInt32 i) const;
     773             :     void SetPoint(const Point& rPnt, sal_uInt32 i);
     774             :     virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 i);
     775             : 
     776             :     // Alle geometrischen Daten holen fuer's Undo/Redo
     777             :     virtual SdrObjGeoData* GetGeoData() const;
     778             :     virtual void SetGeoData(const SdrObjGeoData& rGeo);
     779             : 
     780             :     // ItemSet access
     781             :     const SfxItemSet& GetMergedItemSet() const;
     782             :     void SetMergedItem(const SfxPoolItem& rItem);
     783             :     void ClearMergedItem(const sal_uInt16 nWhich = 0);
     784             :     void SetMergedItemSet(const SfxItemSet& rSet, bool bClearAllItems = false);
     785             :     const SfxPoolItem& GetMergedItem(const sal_uInt16 nWhich) const;
     786             : 
     787             :     // internal versions
     788             : protected:
     789             :     const SfxItemSet& GetObjectItemSet() const;
     790             :     void SetObjectItem(const SfxPoolItem& rItem);
     791             :     void SetObjectItemSet(const SfxItemSet& rSet);
     792             :     const SfxPoolItem& GetObjectItem(const sal_uInt16 nWhich) const;
     793             : 
     794             :     // get SfxMapUnit the object is using
     795             :     SfxMapUnit GetObjectMapUnit() const;
     796             : 
     797             : public:
     798             :     // syntactical sugar for ItemSet accesses
     799             :     void SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, bool bClearAllItems = false);
     800             : 
     801             :     // NotPersistAttr fuer Layer, ObjName, geometrische Transformationen, ...
     802             :     void TakeNotPersistAttr(SfxItemSet& rAttr, bool bMerge) const;
     803             :     void ApplyNotPersistAttr(const SfxItemSet& rAttr);
     804             :     void NbcApplyNotPersistAttr(const SfxItemSet& rAttr);
     805             : 
     806             :     // bDontRemoveHardAttr=FALSE: alle in der Vorlage gesetzten Attribute werden am
     807             :     // Zeichenobjekt auf Default gesetzt; TRUE: alle harten Attribute bleiben erhalten.
     808             :     void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr);
     809             :     virtual void NbcSetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
     810             :     SfxStyleSheet* GetStyleSheet() const;
     811             : 
     812             :     // TextEdit
     813             :     virtual bool HasTextEdit() const;
     814             : 
     815             :     // Return==TRUE: TextEditMode gestartet
     816             :     virtual sal_Bool BegTextEdit(SdrOutliner& rOutl);
     817             :     virtual void EndTextEdit(SdrOutliner& rOutl);
     818             : 
     819             :     // Text wird im Format des Outliners gehalten
     820             :     // SetOutlinerParaObject: Eigentumsuebereignung von *pTextObject!
     821             :     virtual void SetOutlinerParaObject(OutlinerParaObject* pTextObject);
     822             :     virtual void NbcSetOutlinerParaObject(OutlinerParaObject* pTextObject);
     823             :     virtual OutlinerParaObject* GetOutlinerParaObject() const;
     824             :     virtual void NbcReformatText();
     825             :     virtual void ReformatText();
     826             : 
     827             :     void BurnInStyleSheetAttributes();
     828             : 
     829             :     // Macrofaehigkeit, z.B. ein Rechteck als PushButton.
     830             :     virtual bool HasMacro() const;
     831             :     virtual SdrObject* CheckMacroHit (const SdrObjMacroHitRec& rRec) const;
     832             :     virtual Pointer GetMacroPointer (const SdrObjMacroHitRec& rRec) const;
     833             :     virtual void PaintMacro (OutputDevice& rOut, const Rectangle& rDirtyRect, const SdrObjMacroHitRec& rRec) const;
     834             :     virtual bool DoMacro (const SdrObjMacroHitRec& rRec);
     835             :     virtual OUString GetMacroPopupComment(const SdrObjMacroHitRec& rRec) const;
     836             :     bool IsMacroHit(const SdrObjMacroHitRec& rRec) const;
     837             : 
     838             :     // Konnektoren. (siehe auch Dokumentation in SvdoEdge.HXX, SdrEdgeObj
     839             :     //               sowie SvdGlue.HXX und SvdGlEV.HXX)
     840             :     // Es gibt Knoten und Kanten. Eine Kante kann theoretisch auch Knoten
     841             :     // sein, das ist jedoch in dieser Version noch nicht implementiert.
     842             :     // Ein Knoten hat eine Anzahl von Klebepunkten, wo Kanten angeklebt
     843             :     // werden koennen.
     844             :     // Eine Kante kann
     845             :     // - ohne Verbindungen sein
     846             :     // - an einem Ende auf der Wiese stehen und am anderen Ende an
     847             :     //   genau einem Knoten gebunden sein
     848             :     // - an beiden Enden mit jeweils genau einem Knoten verbunden sein.
     849             :     // Die Kante ist Listener bei seinen bis zu 2 Knoten.
     850             :     // Wird der Knoten verschoben oder Resized, folgen alle angebundenen
     851             :     // Kanten. Ebenso bei SetGluePoint()... am Knoten.
     852             :     // Beim Verschieben/Resizen der Kante wird dagegen die Verbindung
     853             :     // geloesst.
     854             :     // Objekt ist ein Knoten?
     855             :     virtual bool IsNode() const;
     856             : 
     857             :     // Automatische Klebepunkte:
     858             :     // je 4 Scheitelpunkt- und Eckpositionen muss ein Knotenobjekt liefern
     859             :     // i.d.R. 0=oben, 1=rechts, 2=unten, 3=links
     860             :     virtual SdrGluePoint GetVertexGluePoint(sal_uInt16 nNum) const;
     861             : 
     862             :     // i.d.R. 0=linksoben, 1=rechtsoben, 2=rechtsunten, 3=linksunten
     863             :     virtual SdrGluePoint GetCornerGluePoint(sal_uInt16 nNum) const;
     864             : 
     865             :     // Liste aller Klebepunkte. Kann NULL sein.
     866             :     virtual const SdrGluePointList* GetGluePointList() const;
     867             :     //virtual SdrGluePointList* GetGluePointList();
     868             : 
     869             :     // Nach veraendern der GluePointList muss man am Obj SendRepaintBroadcast rufen!
     870             :     virtual SdrGluePointList* ForceGluePointList();
     871             : 
     872             :     // Temporaer zu setzen fuer Transformationen am Bezugsobjekt
     873             :     void SetGlueReallyAbsolute(bool bOn);
     874             :     void NbcRotateGluePoints(const Point& rRef, long nWink, double sn, double cs);
     875             :     void NbcMirrorGluePoints(const Point& rRef1, const Point& rRef2);
     876             :     void NbcShearGluePoints (const Point& rRef, long nWink, double tn, bool bVShear);
     877             : 
     878             :     // Objekt ist eine Kante?
     879             :     virtual bool IsEdge() const;
     880             : 
     881             :     // bTail1=TRUE: Linienanfang, sonst LinienEnde
     882             :     // pObj=NULL: Disconnect
     883             :     virtual void ConnectToNode(bool bTail1, SdrObject* pObj);
     884             :     virtual void DisconnectFromNode(bool bTail1);
     885             :     virtual SdrObject* GetConnectedNode(bool bTail1) const;
     886             : 
     887             :     /** sets the writing mode of the object's context
     888             : 
     889             :         Objects which itself do not support different writing modes will ignore this call.
     890             : 
     891             :         Objects which support different writing modes, but have an own, explicit writing mode set,
     892             :         will also ignore this call.
     893             : 
     894             :         Objects which support different writing modes, and whose own mode is set to css.text.WritingMode2.CONTEXT,
     895             :         will use the given writing mode to calculate their "effective writing mode".
     896             : 
     897             :         The behaviour of this method is undefined if you pass css.text.WritingMode2.CONTEXT.
     898             : 
     899             :         @param _nContextWritingMode
     900             :             the effective writing mode of the context of the object
     901             :     */
     902             :     virtual void    SetContextWritingMode( const sal_Int16 _nContextWritingMode );
     903             : 
     904             :     // Wenn ein Objekt in der Lage ist, sich in ein Polygon oder in eine
     905             :     // Bezierkurve (oder beides) zu verwandeln, dann sollten die folgenden
     906             :     // Methoden ueberladen werden.
     907             :     // Z.B. Ein RectObj mit Strichstaerke 10, SOLID_PEN in Polygon wandeln:
     908             :     // Im Modus bLineToArea=false soll ein PolyObj mit 4 Stuetzstellen,
     909             :     // Strichstaerke 10 und SOLiD_PEN erzeugt werden.
     910             :     // Im Modus bLineToArea=true dagegen soll das generierte Obj immer ein
     911             :     // LinienAttribut NULL_PEN haben, und die Linie (auch Linienmuster) selbst
     912             :     // durch Polygonflaechen emuliert werden, die dadurch anschliessend vom
     913             :     // Anwender manipuliert werden koennen. Das RectObj kann sich somit also
     914             :     // nur korrekt konvertieren, wenn es als Flaechenattribut NULL_BRUSH
     915             :     // besitzt. Es muesste in diesem Fall dann:
     916             :     // - SOLID_BRUSH mit der Farbe des gesetzten Pen setzen
     917             :     // - NULL_PEN setzen
     918             :     // - PolyPolygon mit 2 Polygonen zu je 4 Stuetzstellen generieren.
     919             :     // Der Returnwert ist jeweils ein SdrObject*, da als Rueckgabe zur Not
     920             :     // auch Gruppenobjekte erlaubt sind (z.B. fuer SdrTextObj).
     921             :     // Bei der Konvertierung von TextObj nach PathObj wird es wohl so sein,
     922             :     // dass beide Modi (bLineToArea=true/false) identisch sind.
     923             :     // Defaulted sind diese Methoden auf "Ich kann das nicht" (FALSE/NULL).
     924             :     virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const;
     925             :     SdrObject* ConvertToPolyObj(bool bBezier, bool bLineToArea) const;
     926             : 
     927             :     // convert this path object to contour object; bForceLineDash converts even
     928             :     // when there is no filled new polygon created from line-to-polygon conversion,
     929             :     // specially used for XLINE_DASH and 3D conversion
     930             :     SdrObject* ConvertToContourObj(SdrObject* pRet, bool bForceLineDash = false) const;
     931             :     SdrObject* ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDash = false) const;
     932             : 
     933             :     // TRUE: Referenz auf ein Obj
     934             :     bool IsVirtualObj() const;
     935             : 
     936             :     // true=Obj kann warsch. gefuellt werden; false=Obj kann warsch. Linienenden haben.
     937             :     // ungueltig, wenn es sich um ein GroupObj handelt.
     938             :     bool IsClosedObj() const;
     939             : 
     940             :     bool IsEdgeObj() const;
     941             :     bool Is3DObj() const;
     942             :     bool IsUnoObj() const;
     943             :     void SetMarkProtect(bool bProt);
     944             :     bool IsMarkProtect() const;
     945             :     void SetInserted(bool bIns);
     946             :     bool IsInserted() const;
     947             :     void SetMoveProtect(bool bProt);
     948             :     bool IsMoveProtect() const;
     949             :     void SetResizeProtect(bool bProt);
     950             :     bool IsResizeProtect() const;
     951             :     void SetPrintable(bool bPrn);
     952             :     bool IsPrintable() const;
     953             :     void SetVisible(bool bVisible);
     954             :     bool IsVisible() const;
     955             :     void SetEmptyPresObj(bool bEpt);
     956             :     bool IsEmptyPresObj() const;
     957             :     void SetNotVisibleAsMaster(bool bFlg);
     958             :     bool IsNotVisibleAsMaster() const;
     959             : 
     960             :     // #i25616#
     961             :     bool LineIsOutsideGeometry() const;
     962             : 
     963             :     // #i25616#
     964             :     bool DoesSupportTextIndentingOnLineWidthChange() const;
     965             : 
     966             :     // applikationsspeziefische Daten
     967             :     sal_uInt16 GetUserDataCount() const;
     968             :     SdrObjUserData* GetUserData(sal_uInt16 nNum) const;
     969             : 
     970             :     void AppendUserData(SdrObjUserData* pData);
     971             : 
     972             :     // Delete entfernt den Record aus der Liste und ruft
     973             :     // ein delete (FreeMem+Dtor).
     974             :     void DeleteUserData(sal_uInt16 nNum);
     975             : 
     976             :     // ItemPool fuer dieses Objekt wechseln
     977             :     void MigrateItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel = 0L);
     978             : 
     979             :     ////////////////////////////////////////////////////////////////////////////////////////////////////
     980             :     // access to the UNO representation of the shape
     981             :     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getUnoShape();
     982       65900 :     ::com::sun::star::uno::WeakReference< ::com::sun::star::uno::XInterface > getWeakUnoShape() const { return maWeakUnoShape; }
     983             : 
     984             :     static SdrObject* getSdrObjectFromXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt );
     985             : 
     986             :     /** Sets a new UNO representation of the shape
     987             :       *
     988             :       * This is only a public interface function. The actual work is
     989             :       * done by impl_setUnoShape().
     990             :       *
     991             :       * Calling this function is only allowed for the UNO representation
     992             :       * itself!
     993             :       */
     994             :     void setUnoShape(
     995             :             const com::sun::star::uno::Reference<
     996             :                 com::sun::star::uno::XInterface>& _rxUnoShape);
     997             : 
     998             :     /** retrieves the instance responsible for notifying changes in the properties of the shape associated with
     999             :         the SdrObject
    1000             : 
    1001             :         @precond
    1002             :             There already exists an SvxShape instance associated with the SdrObject
    1003             :         @throws ::com::sun::star::uno::RuntimeException
    1004             :             if there does nt yet exists an SvxShape instance associated with the SdrObject.
    1005             :     */
    1006             :     ::svx::PropertyChangeNotifier&
    1007             :         getShapePropertyChangeNotifier();
    1008             : 
    1009             :     /** notifies a change in the given property, to all applicable listeners registered at the associated SvxShape
    1010             : 
    1011             :         This method is equivalent to calling getShapePropertyChangeNotifier().notifyPropertyChange( _eProperty ),
    1012             :         exception that it is allowed to be called when there does not yet exist an associated SvxShape - in which
    1013             :         case the method will silently return without doing anything.
    1014             :     */
    1015             :     void    notifyShapePropertyChange( const ::svx::ShapeProperty _eProperty ) const;
    1016             : 
    1017             :     ////////////////////////////////////////////////////////////////////////////////////////////////////
    1018             :     //
    1019             :     // transformation interface for StarOfficeAPI. This implements support for
    1020             :     // homogen 3x3 matrices containing the transformation of the SdrObject. At the
    1021             :     // moment it contains a shearX, rotation and translation, but for setting all linear
    1022             :     // transforms like Scale, ShearX, ShearY, Rotate and Translate are supported.
    1023             :     //
    1024             :     // gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
    1025             :     // with the base geometry and returns TRUE. Otherwise it returns FALSE.
    1026             :     virtual sal_Bool TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& rPolyPolygon) const;
    1027             : 
    1028             :     // sets the base geometry of the object using infos contained in the homogen 3x3 matrix.
    1029             :     // If it's an SdrPathObj it will use the provided geometry information. The Polygon has
    1030             :     // to use (0,0) as upper left and will be scaled to the given size in the matrix.
    1031             :     virtual void TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& rPolyPolygon);
    1032             : 
    1033             :     // #116168#
    1034             :     // Give info if object is in destruction
    1035             :     bool IsInDestruction() const;
    1036             : 
    1037             :     // return if fill is != XFILL_NONE
    1038             :     bool HasFillStyle() const;
    1039             :     bool HasLineStyle() const;
    1040             : 
    1041             :     // on import of OLE object from MS documents the BLIP size might be retrieved,
    1042             :     // the following methods are used to control it;
    1043             :     // usually this data makes no sence after the import is finished, since the object
    1044             :     // might be resized
    1045             :     Rectangle GetBLIPSizeRectangle() const;
    1046             :     void SetBLIPSizeRectangle( const Rectangle& aRect );
    1047             : 
    1048             :     /// @see mbDoNotInsertIntoPageAutomatically
    1049             :     void SetDoNotInsertIntoPageAutomatically(bool bSet);
    1050             :     /// @see mbDoNotInsertIntoPageAutomatically
    1051             :     bool IsDoNotInsertIntoPageAutomatically() const;
    1052             : 
    1053             : protected:
    1054             :     /** Sets a new UNO shape
    1055             :       *
    1056             :       * The default implementation of this function sets the new UNO
    1057             :       * shape. Derived classes should override the function to handle
    1058             :       * any other actions that are needed when the shape is being
    1059             :       * changed.
    1060             :       *
    1061             :       * The implementation _must_ call the same method of its parent
    1062             :       * class (preferably as the first step)!
    1063             :       */
    1064             :     virtual void    impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape );
    1065             : 
    1066             :     /**
    1067             :      Helper function for reimplementing Clone().
    1068             :     */
    1069             :     template< typename T > T* CloneHelper() const;
    1070             : 
    1071             : private:
    1072             :     /** only for internal use!
    1073             :     */
    1074             :     SvxShape* getSvxShape();
    1075             : 
    1076             :     /** do not use directly, always use getSvxShape() if you have to! */
    1077             :     SvxShape*   mpSvxShape;
    1078             :     ::com::sun::star::uno::WeakReference< ::com::sun::star::uno::XInterface >
    1079             :                 maWeakUnoShape;
    1080             :     /** HACK: Do not automatically insert newly created object into a page.
    1081             :       *
    1082             :       * The user needs to do it manually later.
    1083             :       */
    1084             :     bool mbDoNotInsertIntoPageAutomatically;
    1085             : };
    1086             : 
    1087             : //************************************************************
    1088             : //   SdrDummyObj
    1089             : //
    1090             : // Wer sich eigene Objekte schafft muss einen Link in der Klasse
    1091             : // SdrObjFactory setzen. Der Handler hat folgendes aussehen:
    1092             : //    void Hdl(SdrObjFactory*)
    1093             : // Er muss sich aus der uebergebenen Instanz die Werte nInventor und
    1094             : // nIdentifier ansehen und entsprechend mit new eine Zeichenobjektinstanz
    1095             : // erzeugen. Einen Zeiger auf diese Instanz hat er in der Membervariablen
    1096             : // pNewObj zu hinterlassen.
    1097             : //
    1098             : //************************************************************
    1099             : 
    1100             : class SVX_DLLPUBLIC SdrObjFactory
    1101             : {
    1102             : public:
    1103             :     sal_uInt32                      nInventor;
    1104             :     sal_uInt16                      nIdentifier;
    1105             : 
    1106             :     // fuer MakeNewObj():
    1107             :     SdrPage*                    pPage;
    1108             :     SdrModel*                   pModel;
    1109             :     SdrObject*                  pNewObj;
    1110             : 
    1111             :     // fuer MakeNewObjUserData():
    1112             :     SdrObject*                  pObj;
    1113             :     SdrObjUserData*             pNewData;
    1114             : 
    1115             : private:
    1116             :     SVX_DLLPRIVATE SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel);
    1117             : 
    1118             : public:
    1119             :     static SdrObject* MakeNewObject(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pPage, SdrModel* pModel=NULL);
    1120             :     static void InsertMakeObjectHdl(const Link& rLink);
    1121             :     static void RemoveMakeObjectHdl(const Link& rLink);
    1122             :     static void InsertMakeUserDataHdl(const Link& rLink);
    1123             :     static void RemoveMakeUserDataHdl(const Link& rLink);
    1124             : };
    1125             : 
    1126             : typedef tools::WeakReference< SdrObject > SdrObjectWeakRef;
    1127             : 
    1128          10 : template< typename T > T* SdrObject::CloneHelper() const
    1129             : {
    1130             :     OSL_ASSERT( typeid( T ) == typeid( *this ));
    1131          10 :     T* pObj = dynamic_cast< T* >( SdrObjFactory::MakeNewObject(GetObjInventor(),GetObjIdentifier(),NULL));
    1132          10 :     if (pObj!=NULL)
    1133          10 :         *pObj=*static_cast< const T* >( this );
    1134          10 :     return pObj;
    1135             : }
    1136             : 
    1137             : #endif //_SVDOBJ_HXX
    1138             : 
    1139             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10