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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_chart2.hxx"
26
27 #include "UndoGuard.hxx"
28 #include "ChartModelClone.hxx"
29 #include "UndoActions.hxx"
30
31 #include <com/sun/star/container/XChild.hpp>
32
33 #include <tools/diagnose_ex.h>
34
35 using namespace ::com::sun::star;
36
37 using ::com::sun::star::uno::Reference;
38 using ::com::sun::star::uno::Sequence;
39 using ::rtl::OUString;
40
41 namespace chart
42 {
43
44 //-----------------------------------------------------------------------------
45
UndoGuard(const OUString & i_undoString,const uno::Reference<document::XUndoManager> & i_undoManager,const ModelFacet i_facet)46 UndoGuard::UndoGuard( const OUString& i_undoString, const uno::Reference< document::XUndoManager > & i_undoManager,
47 const ModelFacet i_facet )
48 :m_xChartModel( i_undoManager->getParent(), uno::UNO_QUERY_THROW )
49 ,m_xUndoManager( i_undoManager )
50 ,m_pDocumentSnapshot()
51 ,m_aUndoString( i_undoString )
52 ,m_bActionPosted( false )
53 {
54 m_pDocumentSnapshot.reset( new ChartModelClone( m_xChartModel, i_facet ) );
55 }
56
57 //-----------------------------------------------------------------------------
58
~UndoGuard()59 UndoGuard::~UndoGuard()
60 {
61 if ( !!m_pDocumentSnapshot )
62 discardSnapshot();
63 }
64
65 //-----------------------------------------------------------------------------
66
commit()67 void UndoGuard::commit()
68 {
69 if ( !m_bActionPosted && !!m_pDocumentSnapshot )
70 {
71 try
72 {
73 const Reference< document::XUndoAction > xAction( new impl::UndoElement( m_aUndoString, m_xChartModel, m_pDocumentSnapshot ) );
74 m_pDocumentSnapshot.reset(); // don't dispose, it's data went over to the UndoElement
75 m_xUndoManager->addUndoAction( xAction );
76 }
77 catch( const uno::Exception& )
78 {
79 DBG_UNHANDLED_EXCEPTION();
80 }
81 }
82 m_bActionPosted = true;
83 }
84
85 //-----------------------------------------------------------------------------
86
rollback()87 void UndoGuard::rollback()
88 {
89 ENSURE_OR_RETURN_VOID( !!m_pDocumentSnapshot, "no snapshot!" );
90 m_pDocumentSnapshot->applyToModel( m_xChartModel );
91 discardSnapshot();
92 }
93
94 //-----------------------------------------------------------------------------
discardSnapshot()95 void UndoGuard::discardSnapshot()
96 {
97 ENSURE_OR_RETURN_VOID( !!m_pDocumentSnapshot, "no snapshot!" );
98 m_pDocumentSnapshot->dispose();
99 m_pDocumentSnapshot.reset();
100 }
101
102 //-----------------------------------------------------------------------------
103
UndoLiveUpdateGuard(const OUString & i_undoString,const uno::Reference<document::XUndoManager> & i_undoManager)104 UndoLiveUpdateGuard::UndoLiveUpdateGuard( const OUString& i_undoString, const uno::Reference< document::XUndoManager >& i_undoManager )
105 :UndoGuard( i_undoString, i_undoManager, E_MODEL )
106 {
107 }
108
~UndoLiveUpdateGuard()109 UndoLiveUpdateGuard::~UndoLiveUpdateGuard()
110 {
111 if ( !isActionPosted() )
112 rollback();
113 }
114
115 //-----------------------------------------------------------------------------
116
UndoLiveUpdateGuardWithData(const OUString & i_undoString,const uno::Reference<document::XUndoManager> & i_undoManager)117 UndoLiveUpdateGuardWithData::UndoLiveUpdateGuardWithData(
118 const OUString& i_undoString, const uno::Reference< document::XUndoManager >& i_undoManager )
119 :UndoGuard( i_undoString, i_undoManager, E_MODEL_WITH_DATA )
120 {
121 }
122
~UndoLiveUpdateGuardWithData()123 UndoLiveUpdateGuardWithData::~UndoLiveUpdateGuardWithData()
124 {
125 if ( !isActionPosted() )
126 rollback();
127 }
128
129 //-----------------------------------------------------------------------------
130
UndoGuardWithSelection(const OUString & i_undoString,const uno::Reference<document::XUndoManager> & i_undoManager)131 UndoGuardWithSelection::UndoGuardWithSelection(
132 const OUString& i_undoString, const uno::Reference< document::XUndoManager >& i_undoManager )
133 :UndoGuard( i_undoString, i_undoManager, E_MODEL_WITH_SELECTION )
134 {
135 }
136
137 //-----------------------------------------------------------------------------
138
~UndoGuardWithSelection()139 UndoGuardWithSelection::~UndoGuardWithSelection()
140 {
141 if ( !isActionPosted() )
142 rollback();
143 }
144
145 //-----------------------------------------------------------------------------
146
UndoContext(const Reference<document::XUndoManager> & i_undoManager,const::rtl::OUString & i_undoTitle)147 UndoContext::UndoContext( const Reference< document::XUndoManager > & i_undoManager, const ::rtl::OUString& i_undoTitle )
148 :m_xUndoManager( i_undoManager )
149 {
150 ENSURE_OR_THROW( m_xUndoManager.is(), "invalid undo manager!" );
151 m_xUndoManager->enterUndoContext( i_undoTitle );
152 }
153
154 //-----------------------------------------------------------------------------
155
~UndoContext()156 UndoContext::~UndoContext()
157 {
158 m_xUndoManager->leaveUndoContext();
159 }
160
161 //-----------------------------------------------------------------------------
162
HiddenUndoContext(const Reference<document::XUndoManager> & i_undoManager)163 HiddenUndoContext::HiddenUndoContext( const Reference< document::XUndoManager > & i_undoManager )
164 :m_xUndoManager( i_undoManager )
165 {
166 ENSURE_OR_THROW( m_xUndoManager.is(), "invalid undo manager!" );
167 try
168 {
169 m_xUndoManager->enterHiddenUndoContext();
170 }
171 catch( const uno::Exception& )
172 {
173 DBG_UNHANDLED_EXCEPTION();
174 m_xUndoManager.clear();
175 // prevents the leaveUndoContext in the dtor
176 }
177 }
178
179 //-----------------------------------------------------------------------------
180
~HiddenUndoContext()181 HiddenUndoContext::~HiddenUndoContext()
182 {
183 try
184 {
185 if ( m_xUndoManager.is() )
186 m_xUndoManager->leaveUndoContext();
187 }
188 catch( const uno::Exception& )
189 {
190 DBG_UNHANDLED_EXCEPTION();
191 }
192 }
193
194 } // namespace chart
195