1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "osl/time.h"
28*b1cdbd2cSJim Jagielski #include "sal/config.h"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/office/XAnnotation.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XDrawPage.hpp>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
35*b1cdbd2cSJim Jagielski #include <cppuhelper/propertysetmixin.hxx>
36*b1cdbd2cSJim Jagielski #include <cppuhelper/compbase1.hxx>
37*b1cdbd2cSJim Jagielski #include <cppuhelper/basemutex.hxx>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #include "drawdoc.hxx"
40*b1cdbd2cSJim Jagielski #include "sdpage.hxx"
41*b1cdbd2cSJim Jagielski #include "textapi.hxx"
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski using ::rtl::OUString;
44*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
45*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
46*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
47*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::office;
48*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::drawing;
49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::geometry;
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text;
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski extern void NotifyDocumentEvent( SdDrawDocument* pDocument, const rtl::OUString& rEventName, const Reference< XInterface >& xSource );
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski namespace sd {
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski class Annotation : private ::cppu::BaseMutex,
59*b1cdbd2cSJim Jagielski 				   public ::cppu::WeakComponentImplHelper1< XAnnotation>,
60*b1cdbd2cSJim Jagielski 				   public ::cppu::PropertySetMixin< XAnnotation >
61*b1cdbd2cSJim Jagielski {
62*b1cdbd2cSJim Jagielski public:
63*b1cdbd2cSJim Jagielski     explicit Annotation( const Reference< XComponentContext >& context, SdPage* pPage );
64*b1cdbd2cSJim Jagielski 
GetPage() const65*b1cdbd2cSJim Jagielski     SdPage* GetPage() const { return mpPage; }
GetModel()66*b1cdbd2cSJim Jagielski     SdrModel* GetModel() { return (mpPage != 0) ? mpPage->GetModel() : 0; }
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski     // XInterface:
69*b1cdbd2cSJim Jagielski     virtual Any SAL_CALL queryInterface(Type const & type) throw (RuntimeException);
acquire()70*b1cdbd2cSJim Jagielski     virtual void SAL_CALL acquire() throw () { ::cppu::WeakComponentImplHelper1< XAnnotation >::acquire(); }
release()71*b1cdbd2cSJim Jagielski     virtual void SAL_CALL release() throw () { ::cppu::WeakComponentImplHelper1< XAnnotation >::release(); }
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     // ::com::sun::star::beans::XPropertySet:
74*b1cdbd2cSJim Jagielski     virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo() throw (RuntimeException);
75*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setPropertyValue(const OUString & aPropertyName, const Any & aValue) throw (RuntimeException, UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException);
76*b1cdbd2cSJim Jagielski     virtual Any SAL_CALL getPropertyValue(const OUString & PropertyName) throw (RuntimeException, UnknownPropertyException, WrappedTargetException);
77*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addPropertyChangeListener(const OUString & aPropertyName, const Reference< XPropertyChangeListener > & xListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException);
78*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removePropertyChangeListener(const OUString & aPropertyName, const Reference< XPropertyChangeListener > & aListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException);
79*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addVetoableChangeListener(const OUString & PropertyName, const Reference< XVetoableChangeListener > & aListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException);
80*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeVetoableChangeListener(const OUString & PropertyName, const Reference< XVetoableChangeListener > & aListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException);
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski     // ::com::sun::star::office::XAnnotation:
83*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any SAL_CALL getAnchor() throw (::com::sun::star::uno::RuntimeException);
84*b1cdbd2cSJim Jagielski     virtual RealPoint2D SAL_CALL getPosition() throw (RuntimeException);
85*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setPosition(const RealPoint2D & the_value) throw (RuntimeException);
86*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::geometry::RealSize2D SAL_CALL getSize() throw (::com::sun::star::uno::RuntimeException);
87*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setSize( const ::com::sun::star::geometry::RealSize2D& _size ) throw (::com::sun::star::uno::RuntimeException);
88*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getAuthor() throw (RuntimeException);
89*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setAuthor(const OUString & the_value) throw (RuntimeException);
90*b1cdbd2cSJim Jagielski     virtual util::DateTime SAL_CALL getDateTime() throw (RuntimeException);
91*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setDateTime(const util::DateTime & the_value) throw (RuntimeException);
92*b1cdbd2cSJim Jagielski     virtual Reference< XText > SAL_CALL getTextRange() throw (RuntimeException);
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski private:
95*b1cdbd2cSJim Jagielski     Annotation(const Annotation &); // not defined
96*b1cdbd2cSJim Jagielski     Annotation& operator=(const Annotation &); // not defined
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     // destructor is private and will be called indirectly by the release call    virtual ~Annotation() {}
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     void createChangeUndo();
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     // overload WeakComponentImplHelperBase::disposing()
103*b1cdbd2cSJim Jagielski     // This function is called upon disposing the component,
104*b1cdbd2cSJim Jagielski     // if your component needs special work when it becomes
105*b1cdbd2cSJim Jagielski     // disposed, do it here.
106*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing();
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 	SdPage* mpPage;
109*b1cdbd2cSJim Jagielski     Reference< XComponentContext > m_xContext;
110*b1cdbd2cSJim Jagielski     mutable ::osl::Mutex m_aMutex;
111*b1cdbd2cSJim Jagielski     RealPoint2D m_Position;
112*b1cdbd2cSJim Jagielski     RealSize2D m_Size;
113*b1cdbd2cSJim Jagielski     OUString m_Author;
114*b1cdbd2cSJim Jagielski     util::DateTime m_DateTime;
115*b1cdbd2cSJim Jagielski 	rtl::Reference< TextApiObject > m_TextRange;
116*b1cdbd2cSJim Jagielski };
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski class UndoInsertOrRemoveAnnotation : public SdrUndoAction
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski public:
121*b1cdbd2cSJim Jagielski 	UndoInsertOrRemoveAnnotation( Annotation& rAnnotation, bool bInsert );
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 	virtual void Undo();
124*b1cdbd2cSJim Jagielski 	virtual void Redo();
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski protected:
127*b1cdbd2cSJim Jagielski     rtl::Reference< Annotation > mxAnnotation;
128*b1cdbd2cSJim Jagielski     bool mbInsert;
129*b1cdbd2cSJim Jagielski     int mnIndex;
130*b1cdbd2cSJim Jagielski };
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski struct AnnotationData
133*b1cdbd2cSJim Jagielski {
134*b1cdbd2cSJim Jagielski     RealPoint2D m_Position;
135*b1cdbd2cSJim Jagielski     RealSize2D m_Size;
136*b1cdbd2cSJim Jagielski     OUString m_Author;
137*b1cdbd2cSJim Jagielski     util::DateTime m_DateTime;
138*b1cdbd2cSJim Jagielski 
getsd::AnnotationData139*b1cdbd2cSJim Jagielski     void get( const rtl::Reference< Annotation >& xAnnotation )
140*b1cdbd2cSJim Jagielski     {
141*b1cdbd2cSJim Jagielski         m_Position = xAnnotation->getPosition();
142*b1cdbd2cSJim Jagielski         m_Size = xAnnotation->getSize();
143*b1cdbd2cSJim Jagielski         m_Author = xAnnotation->getAuthor();
144*b1cdbd2cSJim Jagielski         m_DateTime = xAnnotation->getDateTime();
145*b1cdbd2cSJim Jagielski     }
146*b1cdbd2cSJim Jagielski 
setsd::AnnotationData147*b1cdbd2cSJim Jagielski     void set( const rtl::Reference< Annotation >& xAnnotation )
148*b1cdbd2cSJim Jagielski     {
149*b1cdbd2cSJim Jagielski         xAnnotation->setPosition(m_Position);
150*b1cdbd2cSJim Jagielski         xAnnotation->setSize(m_Size);
151*b1cdbd2cSJim Jagielski         xAnnotation->setAuthor(m_Author);
152*b1cdbd2cSJim Jagielski         xAnnotation->setDateTime(m_DateTime);
153*b1cdbd2cSJim Jagielski     }
154*b1cdbd2cSJim Jagielski };
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski class UndoAnnotation : public SdrUndoAction
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski public:
159*b1cdbd2cSJim Jagielski 	UndoAnnotation( Annotation& rAnnotation );
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	virtual void Undo();
162*b1cdbd2cSJim Jagielski 	virtual void Redo();
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski protected:
165*b1cdbd2cSJim Jagielski     rtl::Reference< Annotation > mxAnnotation;
166*b1cdbd2cSJim Jagielski     AnnotationData maUndoData;
167*b1cdbd2cSJim Jagielski     AnnotationData maRedoData;
168*b1cdbd2cSJim Jagielski };
169*b1cdbd2cSJim Jagielski 
createAnnotation(Reference<XAnnotation> & xAnnotation,SdPage * pPage)170*b1cdbd2cSJim Jagielski void createAnnotation( Reference< XAnnotation >& xAnnotation, SdPage* pPage )
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski 	Reference<XComponentContext> xContext (comphelper_getProcessComponentContext());
173*b1cdbd2cSJim Jagielski 	xAnnotation.set( new Annotation(xContext, pPage) );
174*b1cdbd2cSJim Jagielski 	pPage->addAnnotation(xAnnotation);
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
Annotation(const Reference<XComponentContext> & context,SdPage * pPage)177*b1cdbd2cSJim Jagielski Annotation::Annotation( const Reference< XComponentContext >& context, SdPage* pPage )
178*b1cdbd2cSJim Jagielski : ::cppu::WeakComponentImplHelper1< XAnnotation >(m_aMutex)
179*b1cdbd2cSJim Jagielski , ::cppu::PropertySetMixin< XAnnotation >(context, static_cast< Implements >(IMPLEMENTS_PROPERTY_SET), Sequence< ::rtl::OUString >())
180*b1cdbd2cSJim Jagielski , mpPage( pPage )
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski // overload WeakComponentImplHelperBase::disposing()
185*b1cdbd2cSJim Jagielski // This function is called upon disposing the component,
186*b1cdbd2cSJim Jagielski // if your component needs special work when it becomes
187*b1cdbd2cSJim Jagielski // disposed, do it here.
disposing()188*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::disposing()
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski 	mpPage = 0;
191*b1cdbd2cSJim Jagielski 	if( m_TextRange.is() )
192*b1cdbd2cSJim Jagielski 	{
193*b1cdbd2cSJim Jagielski 		m_TextRange->dispose();
194*b1cdbd2cSJim Jagielski 		m_TextRange.clear();
195*b1cdbd2cSJim Jagielski 	}
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
queryInterface(Type const & type)198*b1cdbd2cSJim Jagielski Any Annotation::queryInterface(Type const & type) throw (RuntimeException)
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     return ::cppu::WeakComponentImplHelper1< XAnnotation>::queryInterface(type);
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski // com.sun.star.beans.XPropertySet:
getPropertySetInfo()204*b1cdbd2cSJim Jagielski Reference< XPropertySetInfo > SAL_CALL Annotation::getPropertySetInfo() throw (RuntimeException)
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski     return ::cppu::PropertySetMixin< XAnnotation >::getPropertySetInfo();
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski 
setPropertyValue(const OUString & aPropertyName,const Any & aValue)209*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::setPropertyValue(const OUString & aPropertyName, const Any & aValue) throw (RuntimeException, UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException)
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski     ::cppu::PropertySetMixin< XAnnotation >::setPropertyValue(aPropertyName, aValue);
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski 
getPropertyValue(const OUString & aPropertyName)214*b1cdbd2cSJim Jagielski Any SAL_CALL Annotation::getPropertyValue(const OUString & aPropertyName) throw (RuntimeException, UnknownPropertyException, WrappedTargetException)
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski     return ::cppu::PropertySetMixin< XAnnotation >::getPropertyValue(aPropertyName);
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski 
addPropertyChangeListener(const OUString & aPropertyName,const Reference<XPropertyChangeListener> & xListener)219*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::addPropertyChangeListener(const OUString & aPropertyName, const Reference< XPropertyChangeListener > & xListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException)
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     ::cppu::PropertySetMixin< XAnnotation >::addPropertyChangeListener(aPropertyName, xListener);
222*b1cdbd2cSJim Jagielski }
223*b1cdbd2cSJim Jagielski 
removePropertyChangeListener(const OUString & aPropertyName,const Reference<XPropertyChangeListener> & xListener)224*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::removePropertyChangeListener(const OUString & aPropertyName, const Reference< XPropertyChangeListener > & xListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException)
225*b1cdbd2cSJim Jagielski {
226*b1cdbd2cSJim Jagielski     ::cppu::PropertySetMixin< XAnnotation >::removePropertyChangeListener(aPropertyName, xListener);
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
addVetoableChangeListener(const OUString & aPropertyName,const Reference<XVetoableChangeListener> & xListener)229*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::addVetoableChangeListener(const OUString & aPropertyName, const Reference< XVetoableChangeListener > & xListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException)
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski     ::cppu::PropertySetMixin< XAnnotation >::addVetoableChangeListener(aPropertyName, xListener);
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
removeVetoableChangeListener(const OUString & aPropertyName,const Reference<XVetoableChangeListener> & xListener)234*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::removeVetoableChangeListener(const OUString & aPropertyName, const Reference< XVetoableChangeListener > & xListener) throw (RuntimeException, UnknownPropertyException, WrappedTargetException)
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski     ::cppu::PropertySetMixin< XAnnotation >::removeVetoableChangeListener(aPropertyName, xListener);
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski 
getAnchor()239*b1cdbd2cSJim Jagielski Any SAL_CALL Annotation::getAnchor() throw (RuntimeException)
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski     osl::MutexGuard g(m_aMutex);
242*b1cdbd2cSJim Jagielski     Any aRet;
243*b1cdbd2cSJim Jagielski     if( mpPage )
244*b1cdbd2cSJim Jagielski     {
245*b1cdbd2cSJim Jagielski         Reference< XDrawPage > xPage( mpPage->getUnoPage(), UNO_QUERY );
246*b1cdbd2cSJim Jagielski         aRet <<= xPage;
247*b1cdbd2cSJim Jagielski     }
248*b1cdbd2cSJim Jagielski     return aRet;
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski // ::com::sun::star::office::XAnnotation:
getPosition()252*b1cdbd2cSJim Jagielski RealPoint2D SAL_CALL Annotation::getPosition() throw (RuntimeException)
253*b1cdbd2cSJim Jagielski {
254*b1cdbd2cSJim Jagielski     osl::MutexGuard g(m_aMutex);
255*b1cdbd2cSJim Jagielski     return m_Position;
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
setPosition(const RealPoint2D & the_value)258*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::setPosition(const RealPoint2D & the_value) throw (RuntimeException)
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski     prepareSet(
261*b1cdbd2cSJim Jagielski         rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Position")),
262*b1cdbd2cSJim Jagielski         Any(), Any(), 0);
263*b1cdbd2cSJim Jagielski     {
264*b1cdbd2cSJim Jagielski         osl::MutexGuard g(m_aMutex);
265*b1cdbd2cSJim Jagielski         createChangeUndo();
266*b1cdbd2cSJim Jagielski         m_Position = the_value;
267*b1cdbd2cSJim Jagielski     }
268*b1cdbd2cSJim Jagielski }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski // ::com::sun::star::office::XAnnotation:
getSize()271*b1cdbd2cSJim Jagielski RealSize2D SAL_CALL Annotation::getSize() throw (RuntimeException)
272*b1cdbd2cSJim Jagielski {
273*b1cdbd2cSJim Jagielski     osl::MutexGuard g(m_aMutex);
274*b1cdbd2cSJim Jagielski     return m_Size;
275*b1cdbd2cSJim Jagielski }
276*b1cdbd2cSJim Jagielski 
setSize(const RealSize2D & the_value)277*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::setSize(const RealSize2D & the_value) throw (RuntimeException)
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski     prepareSet(
280*b1cdbd2cSJim Jagielski         rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Size")),
281*b1cdbd2cSJim Jagielski         Any(), Any(), 0);
282*b1cdbd2cSJim Jagielski     {
283*b1cdbd2cSJim Jagielski         osl::MutexGuard g(m_aMutex);
284*b1cdbd2cSJim Jagielski         createChangeUndo();
285*b1cdbd2cSJim Jagielski         m_Size = the_value;
286*b1cdbd2cSJim Jagielski     }
287*b1cdbd2cSJim Jagielski }
288*b1cdbd2cSJim Jagielski 
getAuthor()289*b1cdbd2cSJim Jagielski OUString SAL_CALL Annotation::getAuthor() throw (RuntimeException)
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski     osl::MutexGuard g(m_aMutex);
292*b1cdbd2cSJim Jagielski     return m_Author;
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
setAuthor(const OUString & the_value)295*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::setAuthor(const OUString & the_value) throw (RuntimeException)
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski     prepareSet(
298*b1cdbd2cSJim Jagielski         rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Author")),
299*b1cdbd2cSJim Jagielski         Any(), Any(), 0);
300*b1cdbd2cSJim Jagielski     {
301*b1cdbd2cSJim Jagielski         osl::MutexGuard g(m_aMutex);
302*b1cdbd2cSJim Jagielski         createChangeUndo();
303*b1cdbd2cSJim Jagielski         m_Author = the_value;
304*b1cdbd2cSJim Jagielski     }
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski 
getDateTime()307*b1cdbd2cSJim Jagielski util::DateTime SAL_CALL Annotation::getDateTime() throw (RuntimeException)
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski     osl::MutexGuard g(m_aMutex);
310*b1cdbd2cSJim Jagielski     return m_DateTime;
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski 
setDateTime(const util::DateTime & the_value)313*b1cdbd2cSJim Jagielski void SAL_CALL Annotation::setDateTime(const util::DateTime & the_value) throw (RuntimeException)
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski     prepareSet(
316*b1cdbd2cSJim Jagielski         rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DateTime")),
317*b1cdbd2cSJim Jagielski         Any(), Any(), 0);
318*b1cdbd2cSJim Jagielski     {
319*b1cdbd2cSJim Jagielski         osl::MutexGuard g(m_aMutex);
320*b1cdbd2cSJim Jagielski         createChangeUndo();
321*b1cdbd2cSJim Jagielski         m_DateTime = the_value;
322*b1cdbd2cSJim Jagielski     }
323*b1cdbd2cSJim Jagielski }
324*b1cdbd2cSJim Jagielski 
createChangeUndo()325*b1cdbd2cSJim Jagielski void Annotation::createChangeUndo()
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski     SdrModel* pModel = GetModel();
328*b1cdbd2cSJim Jagielski     if( pModel && pModel->IsUndoEnabled() )
329*b1cdbd2cSJim Jagielski         pModel->AddUndo( new UndoAnnotation( *this ) );
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski     if( pModel )
332*b1cdbd2cSJim Jagielski     {
333*b1cdbd2cSJim Jagielski         pModel->SetChanged();
334*b1cdbd2cSJim Jagielski         Reference< XInterface > xSource( static_cast<uno::XWeak*>( this ) );
335*b1cdbd2cSJim Jagielski         NotifyDocumentEvent( static_cast< SdDrawDocument* >( pModel ), OUString( RTL_CONSTASCII_USTRINGPARAM("OnAnnotationChanged") ), xSource );
336*b1cdbd2cSJim Jagielski     }
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski 
getTextRange()339*b1cdbd2cSJim Jagielski Reference< XText > SAL_CALL Annotation::getTextRange() throw (RuntimeException)
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski     osl::MutexGuard g(m_aMutex);
342*b1cdbd2cSJim Jagielski 	if( !m_TextRange.is() && (mpPage != 0) )
343*b1cdbd2cSJim Jagielski 	{
344*b1cdbd2cSJim Jagielski 		m_TextRange = TextApiObject::create( static_cast< SdDrawDocument* >( mpPage->GetModel() ) );
345*b1cdbd2cSJim Jagielski 	}
346*b1cdbd2cSJim Jagielski     return Reference< XText >( m_TextRange.get() );
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski 
CreateUndoInsertOrRemoveAnnotation(const Reference<XAnnotation> & xAnnotation,bool bInsert)349*b1cdbd2cSJim Jagielski SdrUndoAction* CreateUndoInsertOrRemoveAnnotation( const Reference< XAnnotation >& xAnnotation, bool bInsert )
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski     Annotation* pAnnotation = dynamic_cast< Annotation* >( xAnnotation.get() );
352*b1cdbd2cSJim Jagielski     if( pAnnotation )
353*b1cdbd2cSJim Jagielski     {
354*b1cdbd2cSJim Jagielski         return new UndoInsertOrRemoveAnnotation( *pAnnotation, bInsert );
355*b1cdbd2cSJim Jagielski     }
356*b1cdbd2cSJim Jagielski     else
357*b1cdbd2cSJim Jagielski     {
358*b1cdbd2cSJim Jagielski         return 0;
359*b1cdbd2cSJim Jagielski     }
360*b1cdbd2cSJim Jagielski }
361*b1cdbd2cSJim Jagielski 
UndoInsertOrRemoveAnnotation(Annotation & rAnnotation,bool bInsert)362*b1cdbd2cSJim Jagielski UndoInsertOrRemoveAnnotation::UndoInsertOrRemoveAnnotation( Annotation& rAnnotation, bool bInsert )
363*b1cdbd2cSJim Jagielski : SdrUndoAction( *rAnnotation.GetModel() )
364*b1cdbd2cSJim Jagielski , mxAnnotation( &rAnnotation )
365*b1cdbd2cSJim Jagielski , mbInsert( bInsert )
366*b1cdbd2cSJim Jagielski , mnIndex( 0 )
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     SdPage* pPage = rAnnotation.GetPage();
369*b1cdbd2cSJim Jagielski     if( pPage )
370*b1cdbd2cSJim Jagielski     {
371*b1cdbd2cSJim Jagielski         Reference< XAnnotation > xAnnotation( &rAnnotation );
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski         const AnnotationVector& rVec = pPage->getAnnotations();
374*b1cdbd2cSJim Jagielski         for( AnnotationVector::const_iterator iter = rVec.begin(); iter != rVec.end(); iter++ )
375*b1cdbd2cSJim Jagielski         {
376*b1cdbd2cSJim Jagielski             if( (*iter) == xAnnotation )
377*b1cdbd2cSJim Jagielski                 break;
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski             mnIndex++;
380*b1cdbd2cSJim Jagielski         }
381*b1cdbd2cSJim Jagielski     }
382*b1cdbd2cSJim Jagielski }
383*b1cdbd2cSJim Jagielski 
Undo()384*b1cdbd2cSJim Jagielski void UndoInsertOrRemoveAnnotation::Undo()
385*b1cdbd2cSJim Jagielski {
386*b1cdbd2cSJim Jagielski     SdPage* pPage = mxAnnotation->GetPage();
387*b1cdbd2cSJim Jagielski     SdrModel* pModel = mxAnnotation->GetModel();
388*b1cdbd2cSJim Jagielski     if( pPage && pModel )
389*b1cdbd2cSJim Jagielski     {
390*b1cdbd2cSJim Jagielski         Reference< XAnnotation > xAnnotation( mxAnnotation.get() );
391*b1cdbd2cSJim Jagielski         if( mbInsert )
392*b1cdbd2cSJim Jagielski         {
393*b1cdbd2cSJim Jagielski             pPage->removeAnnotation( xAnnotation );
394*b1cdbd2cSJim Jagielski         }
395*b1cdbd2cSJim Jagielski         else
396*b1cdbd2cSJim Jagielski         {
397*b1cdbd2cSJim Jagielski             pPage->addAnnotation( xAnnotation, mnIndex );
398*b1cdbd2cSJim Jagielski         }
399*b1cdbd2cSJim Jagielski     }
400*b1cdbd2cSJim Jagielski }
401*b1cdbd2cSJim Jagielski 
Redo()402*b1cdbd2cSJim Jagielski void UndoInsertOrRemoveAnnotation::Redo()
403*b1cdbd2cSJim Jagielski {
404*b1cdbd2cSJim Jagielski     SdPage* pPage = mxAnnotation->GetPage();
405*b1cdbd2cSJim Jagielski     SdrModel* pModel = mxAnnotation->GetModel();
406*b1cdbd2cSJim Jagielski     if( pPage && pModel )
407*b1cdbd2cSJim Jagielski     {
408*b1cdbd2cSJim Jagielski         Reference< XAnnotation > xAnnotation( mxAnnotation.get() );
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski         if( mbInsert )
411*b1cdbd2cSJim Jagielski         {
412*b1cdbd2cSJim Jagielski             pPage->addAnnotation( xAnnotation, mnIndex );
413*b1cdbd2cSJim Jagielski         }
414*b1cdbd2cSJim Jagielski         else
415*b1cdbd2cSJim Jagielski         {
416*b1cdbd2cSJim Jagielski             pPage->removeAnnotation( xAnnotation );
417*b1cdbd2cSJim Jagielski         }
418*b1cdbd2cSJim Jagielski     }
419*b1cdbd2cSJim Jagielski }
420*b1cdbd2cSJim Jagielski 
UndoAnnotation(Annotation & rAnnotation)421*b1cdbd2cSJim Jagielski UndoAnnotation::UndoAnnotation( Annotation& rAnnotation )
422*b1cdbd2cSJim Jagielski : SdrUndoAction( *rAnnotation.GetModel() )
423*b1cdbd2cSJim Jagielski , mxAnnotation( &rAnnotation )
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski     maUndoData.get( mxAnnotation );
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
Undo()428*b1cdbd2cSJim Jagielski void UndoAnnotation::Undo()
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski     maRedoData.get( mxAnnotation );
431*b1cdbd2cSJim Jagielski     maUndoData.set( mxAnnotation );
432*b1cdbd2cSJim Jagielski }
433*b1cdbd2cSJim Jagielski 
Redo()434*b1cdbd2cSJim Jagielski void UndoAnnotation::Redo()
435*b1cdbd2cSJim Jagielski {
436*b1cdbd2cSJim Jagielski     maUndoData.get( mxAnnotation );
437*b1cdbd2cSJim Jagielski     maRedoData.set( mxAnnotation );
438*b1cdbd2cSJim Jagielski }
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski } // namespace sd
441*b1cdbd2cSJim Jagielski 
442