xref: /trunk/main/reportdesign/inc/UndoActions.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef RPTUI_UNDOACTIONS_HXX
28 #define RPTUI_UNDOACTIONS_HXX
29 
30 #include "dllapi.h"
31 
32 #include "RptModel.hxx"
33 
34 /** === begin UNO includes === **/
35 #include <com/sun/star/util/XModifyListener.hpp>
36 #include <com/sun/star/beans/XPropertySet.hpp>
37 #include <com/sun/star/beans/PropertyChangeEvent.hpp>
38 #include <com/sun/star/script/ScriptEvent.hpp>
39 #include <com/sun/star/script/XScriptListener.hpp>
40 #include <com/sun/star/script/ScriptEventDescriptor.hpp>
41 #include <com/sun/star/container/XNameContainer.hpp>
42 #include <com/sun/star/container/ContainerEvent.hpp>
43 #include <com/sun/star/container/XNameContainer.hpp>
44 #include <com/sun/star/report/XReportComponent.hpp>
45 #include <com/sun/star/report/XReportDefinition.hpp>
46 #include <com/sun/star/report/XGroup.hpp>
47 #include <com/sun/star/document/XUndoManager.hpp>
48 /** === end UNO includes === **/
49 
50 #include <cppuhelper/implbase3.hxx>
51 #include <comphelper/uno3.hxx>
52 #include <comphelper/sequence.hxx>
53 #include <svl/lstner.hxx>
54 #include <svx/svdouno.hxx>
55 #include <svx/svdundo.hxx>
56 #include <tools/string.hxx>
57 
58 #include <functional>
59 #include <memory>
60 #include <boost/shared_ptr.hpp>
61 
62 FORWARD_DECLARE_INTERFACE(awt,XControl)
63 FORWARD_DECLARE_INTERFACE(awt,XControlContainer)
64 namespace dbaui
65 {
66     class IController;
67 }
68 namespace rptui
69 {
70     class OObjectBase;
71 
72     enum Action
73     {
74         Inserted = 1,
75         Removed  = 2
76     };
77 
78     /** Helper class to allow std::mem_fun for SAL_CALL
79     */
80     class REPORTDESIGN_DLLPUBLIC OGroupHelper
81     {
82         ::com::sun::star::uno::Reference< ::com::sun::star::report::XGroup > m_xGroup;
83         OGroupHelper(const OGroupHelper&);
84         OGroupHelper& operator=(const OGroupHelper&);
85     public:
86         OGroupHelper(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XGroup >& _xGroup)
87             :m_xGroup(_xGroup)
88         {
89         }
90         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >   getHeader() { return m_xGroup->getHeader(); }
91         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >   getFooter() { return m_xGroup->getFooter(); }
92         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XGroup >     getGroup() { return m_xGroup; }
93 
94         inline ::sal_Bool getHeaderOn() { return m_xGroup->getHeaderOn(); }
95         inline ::sal_Bool getFooterOn() { return m_xGroup->getFooterOn(); }
96 
97         static ::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection> , OGroupHelper> getMemberFunction(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >& _xSection);
98 
99     };
100     typedef com::sun::star::uno::Reference< ::com::sun::star::report::XSection > TSection;
101 
102     /** Helper class to allow std::mem_fun for SAL_CALL
103     */
104     class REPORTDESIGN_DLLPUBLIC OReportHelper
105     {
106         ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportDefinition > m_xReport;
107     public:
108         OReportHelper(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportDefinition >& _xReport)
109             :m_xReport(_xReport)
110         {
111         }
112         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection > getReportHeader() { return m_xReport->getReportHeader(); }
113         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection > getReportFooter() { return m_xReport->getReportFooter(); }
114         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection > getPageHeader()   { return m_xReport->getPageHeader(); }
115         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection > getPageFooter()   { return m_xReport->getPageFooter(); }
116         inline ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection > getDetail()       { return m_xReport->getDetail(); }
117 
118         inline ::sal_Bool getReportHeaderOn() { return m_xReport->getReportHeaderOn(); }
119         inline ::sal_Bool getReportFooterOn() { return m_xReport->getReportFooterOn(); }
120         inline ::sal_Bool getPageHeaderOn() { return m_xReport->getPageHeaderOn(); }
121         inline ::sal_Bool getPageFooterOn() { return m_xReport->getPageFooterOn(); }
122 
123         static ::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection> , OReportHelper> getMemberFunction(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >& _xSection);
124     };
125 
126     //==================================================================================================================
127     //= UndoContext
128     //==================================================================================================================
129     class UndoContext
130     {
131     public:
132         UndoContext( SfxUndoManager& i_undoManager, const ::rtl::OUString& i_undoTitle )
133             :m_rUndoManager( i_undoManager )
134         {
135             m_rUndoManager.EnterListAction( i_undoTitle, String() );
136         }
137 
138         ~UndoContext()
139         {
140             m_rUndoManager.LeaveListAction();
141         }
142 
143     private:
144         SfxUndoManager& m_rUndoManager;
145     };
146 
147     //==================================================================================================================
148     //= UndoSuppressor
149     //==================================================================================================================
150     class UndoSuppressor
151     {
152     public:
153         UndoSuppressor( SfxUndoManager& i_undoManager )
154             :m_rUndoManager( i_undoManager )
155         {
156             m_rUndoManager.EnableUndo( false );
157         }
158 
159         ~UndoSuppressor()
160         {
161             m_rUndoManager.EnableUndo( true );
162         }
163 
164     private:
165         SfxUndoManager& m_rUndoManager;
166     };
167 
168     //==================================================================================================================
169     //= OCommentUndoAction
170     //==================================================================================================================
171     class REPORTDESIGN_DLLPUBLIC OCommentUndoAction : public SdrUndoAction
172     {
173     protected:
174         String                  m_strComment; // undo, redo comment
175         ::dbaui::IController*   m_pController;
176 
177     public:
178         TYPEINFO();
179         OCommentUndoAction( SdrModel& rMod
180                             ,sal_uInt16 nCommentID);
181         virtual ~OCommentUndoAction();
182 
183         virtual UniString   GetComment() const { return m_strComment; }
184         virtual void        Undo();
185         virtual void        Redo();
186     };
187     //==================================================================
188     // OUndoContainerAction
189     //==================================================================
190     class REPORTDESIGN_DLLPUBLIC OUndoContainerAction: public OCommentUndoAction
191     {
192         OUndoContainerAction(OUndoContainerAction&);
193         void operator =(OUndoContainerAction&);
194     protected:
195         ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
196                         m_xElement;     // object not owned by the action
197         ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
198                         m_xOwnElement;  // object owned by the action
199         ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer >
200                         m_xContainer;
201         ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
202                         m_xSection;
203         Action          m_eAction;
204 
205     public:
206         OUndoContainerAction(SdrModel& rMod
207                             ,Action _eAction
208                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer > _xContainer
209                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& xElem
210                             ,sal_uInt16 _nCommentId);
211         virtual ~OUndoContainerAction();
212 
213         virtual void Undo();
214         virtual void Redo();
215 
216     protected:
217         virtual void    implReInsert( ) SAL_THROW( ( ::com::sun::star::uno::Exception ) );
218         virtual void    implReRemove( ) SAL_THROW( ( ::com::sun::star::uno::Exception ) );
219     };
220 
221     //==================================================================
222     // OUndoReportSectionAction
223     //==================================================================
224     class REPORTDESIGN_DLLPUBLIC OUndoReportSectionAction : public OUndoContainerAction
225     {
226         OReportHelper                               m_aReportHelper;
227         ::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
228                                     ,OReportHelper> m_pMemberFunction;
229     public:
230         OUndoReportSectionAction(SdrModel& rMod
231                             ,Action _eAction
232                             ,::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
233                                 ,OReportHelper> _pMemberFunction
234                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportDefinition >& _xReport
235                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& xElem
236                             ,sal_uInt16 _nCommentId);
237 
238     protected:
239         virtual void    implReInsert( ) SAL_THROW( ( ::com::sun::star::uno::Exception ) );
240         virtual void    implReRemove( ) SAL_THROW( ( ::com::sun::star::uno::Exception ) );
241     };
242 
243     //==================================================================
244     // OUndoGroupSectionAction
245     //==================================================================
246     class REPORTDESIGN_DLLPUBLIC OUndoGroupSectionAction : public OUndoContainerAction
247     {
248         OGroupHelper                                m_aGroupHelper;
249         ::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
250                                     ,OGroupHelper> m_pMemberFunction;
251     public:
252         OUndoGroupSectionAction(SdrModel& rMod
253                             ,Action _eAction
254                             ,::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
255                                             ,OGroupHelper> _pMemberFunction
256                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::report::XGroup >& _xGroup
257                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& xElem
258                             ,sal_uInt16 _nCommentId);
259 
260     protected:
261         virtual void    implReInsert( ) SAL_THROW( ( ::com::sun::star::uno::Exception ) );
262         virtual void    implReRemove( ) SAL_THROW( ( ::com::sun::star::uno::Exception ) );
263     };
264 
265     ///==================================================================
266     /// ORptUndoPropertyAction
267     ///==================================================================
268     class REPORTDESIGN_DLLPUBLIC ORptUndoPropertyAction: public OCommentUndoAction
269     {
270         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xObj;
271         ::rtl::OUString                     m_aPropertyName;
272         ::com::sun::star::uno::Any          m_aNewValue;
273         ::com::sun::star::uno::Any          m_aOldValue;
274 
275         /** sets either the old value or the new value again at the property set.
276          *
277          * \param _bOld If set to <TRUE/> than the old value will be set otherwise the new value will be set.
278          */
279         void setProperty(sal_Bool _bOld);
280     protected:
281         virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> getObject();
282 
283     public:
284         ORptUndoPropertyAction(SdrModel& rMod, const ::com::sun::star::beans::PropertyChangeEvent& evt);
285 
286         virtual void Undo();
287         virtual void Redo();
288 
289         virtual String          GetComment() const;
290     };
291 
292     //==================================================================
293     // OUndoPropertyReportSectionAction
294     //==================================================================
295     class REPORTDESIGN_DLLPUBLIC OUndoPropertyReportSectionAction : public ORptUndoPropertyAction
296     {
297         OReportHelper                               m_aReportHelper;
298         ::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
299                                     ,OReportHelper> m_pMemberFunction;
300     protected:
301         virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> getObject();
302     public:
303         OUndoPropertyReportSectionAction(SdrModel& rMod
304                             ,const ::com::sun::star::beans::PropertyChangeEvent& evt
305                             ,::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
306                                 ,OReportHelper> _pMemberFunction
307                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportDefinition >& _xReport
308                             );
309     };
310 
311     //==================================================================
312     // OUndoPropertyGroupSectionAction
313     //==================================================================
314     class REPORTDESIGN_DLLPUBLIC OUndoPropertyGroupSectionAction : public ORptUndoPropertyAction
315     {
316         OGroupHelper                                m_aGroupHelper;
317         ::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
318                                     ,OGroupHelper> m_pMemberFunction;
319     protected:
320         virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> getObject();
321     public:
322         OUndoPropertyGroupSectionAction(SdrModel& rMod
323                             ,const ::com::sun::star::beans::PropertyChangeEvent& evt
324                             ,::std::mem_fun_t< ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >
325                                             ,OGroupHelper> _pMemberFunction
326                             ,const ::com::sun::star::uno::Reference< ::com::sun::star::report::XGroup >& _xGroup
327                             );
328     };
329 
330 }
331 #endif //RPTUI_UNDOACTIONS_HXX
332 
333