xref: /AOO41X/main/svx/inc/svx/sdr/contact/viewcontact.hxx (revision 025b059733df8a26f6b22068efe91c1a0b65ee8b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _SDR_CONTACT_VIEWCONTACT_HXX
25 #define _SDR_CONTACT_VIEWCONTACT_HXX
26 
27 #include <sal/types.h>
28 #include <tools/gen.hxx>
29 #include "svx/svxdllapi.h"
30 #include <drawinglayer/primitive2d/baseprimitive2d.hxx>
31 
32 //////////////////////////////////////////////////////////////////////////////
33 // predeclarations
34 
35 class SetOfByte;
36 class SdrPage;
37 class SdrObject;
38 
39 namespace sdr
40 {
41     namespace contact
42     {
43         class ObjectContact;
44         class ViewObjectContact;
45     } // end of namespace contact
46 } // end of namespace sdr
47 
48 //////////////////////////////////////////////////////////////////////////////
49 
50 namespace sdr
51 {
52     namespace contact
53     {
54         class SVX_DLLPUBLIC ViewContact
55         {
56         private:
57             // make ViewObjectContact a friend to exclusively allow it to use
58             // AddViewObjectContact/RemoveViewObjectContact
59             friend class ViewObjectContact;
60 
61             // List of ViewObjectContacts. This contains all VOCs which were constructed
62             // with this VC. Since the VOCs remember a reference to this VC, this list needs
63             // to be kept and is used e.g. at destructor to destroy all VOCs.
64             // Registering and de-registering is done in the VOC constructors/destructors.
65             std::vector< ViewObjectContact* >               maViewObjectContactVector;
66 
67             // Primitive2DSequence of the ViewContact. This contains all necessary information
68             // for the graphical visualisation and needs to be supported by all VCs which
69             // can be visualized.
70             drawinglayer::primitive2d::Primitive2DSequence  mxViewIndependentPrimitive2DSequence;
71 
72             // A new ViewObjectContact was created and shall be remembered.
73             void AddViewObjectContact(ViewObjectContact& rVOContact);
74 
75             // A ViewObjectContact was deleted and shall be forgotten.
76             void RemoveViewObjectContact(ViewObjectContact& rVOContact);
77 
78             // internal tooling to delete VOCs
79             void deleteAllVOCs();
80 
81         protected:
82             // Interface to allow derivates to travel over the registered VOC's
getViewObjectContactCount() const83             sal_uInt32 getViewObjectContactCount() const { return maViewObjectContactVector.size(); }
getViewObjectContact(sal_uInt32 a) const84             ViewObjectContact* getViewObjectContact(sal_uInt32 a) const { return maViewObjectContactVector[a]; }
85 
86             // Create a Object-Specific ViewObjectContact, set ViewContact and
87             // ObjectContact. Always needs to return something. Default is to create
88             // a standard ViewObjectContact containing the given ObjectContact and *this
89             virtual ViewObjectContact& CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact);
90 
91             // This method is responsible for creating the graphical visualisation data derived ONLY from
92             // the model data. It will be stored/buffered in mxViewIndependentPrimitive2DSequence. The default implementation
93             // creates a yellow replacement rectangle (1000, 1000, 5000, 3000) to visualize missing
94             // implementations. All implementations have to provide basic geometry here, this is the central
95             // visualisation method and will also be used for BoundRect computations in the long run.
96             // This means it's always an error when the default implementation is called and thus gets
97             // asserted there
98             virtual drawinglayer::primitive2d::Primitive2DSequence createViewIndependentPrimitive2DSequence() const;
99 
100             // method for flushing View Independent Primitive2DSequence for VOC implementations
flushViewIndependentPrimitive2DSequence()101             void flushViewIndependentPrimitive2DSequence() { mxViewIndependentPrimitive2DSequence.realloc(0); }
102 
103             // basic constructor. Since this is a base class only, it shall
104             // never be called directly
105             ViewContact();
106 
107             // Methods to react on start getting viewed or stop getting
108             // viewed. This info is derived from the count of members of
109             // registered ViewObjectContacts. Default does nothing.
110             virtual void StartGettingViewed();
111             virtual void StopGettingViewed();
112 
113         public:
114             // basic destructor with needed cleanups
115             virtual ~ViewContact();
116 
117             // get a Object-specific ViewObjectContact for a specific
118             // ObjectContact (->View). Always needs to return something.
119             ViewObjectContact& GetViewObjectContact(ObjectContact& rObjectContact);
120 
121             // Test if this ViewContact has ViewObjectContacts at all. This can
122             // be used to test if this ViewContact is visualized ATM or not
123             bool HasViewObjectContacts(bool bExcludePreviews = false) const;
124 
125             // Check if this primitive is animated in any OC (View) which means it has
126             // generated a PrimitiveAnimation in it's VOC
127             bool isAnimatedInAnyViewObjectContact() const;
128 
129             // Access to possible sub-hierarchy and parent. GetObjectCount() default is 0L
130             // and GetViewContact default pops up an assert since it's an error if
131             // GetObjectCount has a result != 0 and it's not overloaded.
132             virtual sal_uInt32 GetObjectCount() const;
133             virtual ViewContact& GetViewContact(sal_uInt32 nIndex) const;
134             virtual ViewContact* GetParentContact() const;
135 
136             // React on insertion of a child into DRawHierarchy starting
137             // from this object
138             void ActionChildInserted(ViewContact& rChild);
139 
140             // React on changes of the object of this ViewContact
141             virtual void ActionChanged();
142 
143             // access to SdrObject and/or SdrPage. May return 0L like the default
144             // implementations do. Needs to be overloaded as needed.
145             virtual SdrObject* TryToGetSdrObject() const;
146             virtual SdrPage* TryToGetSdrPage() const;
147 
148             // access to the local primitive. This will ensure that the primitive is
149             // current in comparing the local one with a fresh created incarnation
150             drawinglayer::primitive2d::Primitive2DSequence getViewIndependentPrimitive2DSequence() const;
151 
152             // add Gluepoints (if available)
153             virtual drawinglayer::primitive2d::Primitive2DSequence createGluePointPrimitive2DSequence() const;
154 
155             // allow embedding if needed (e.g. for SdrObjects, evtl. Name, Title and description get added). This
156             // is a helper normally used from getViewIndependentPrimitive2DSequence(), but there is one exception
157             // for 3D scenes
158             virtual drawinglayer::primitive2d::Primitive2DSequence embedToObjectSpecificInformation(const drawinglayer::primitive2d::Primitive2DSequence& rSource) const;
159 
160             // delete all existing VOCs including DrawHierarchy which will invalidate all
161             // visualisations, too. Used mostly at object removal from DrawHierarchy to
162             // delete all existing VOCs by purpose, but can also be used for other purposes.
163             // It is always possible to delete the VOCs, these are re-created on demand
164             void flushViewObjectContacts(bool bWithHierarchy = true);
165         };
166     } // end of namespace contact
167 } // end of namespace sdr
168 
169 //////////////////////////////////////////////////////////////////////////////
170 
171 #endif //_SDR_CONTACT_VIEWCONTACT_HXX
172 
173 // eof
174