169ffbee1SArmin Le Grand /**************************************************************
269ffbee1SArmin Le Grand  *
369ffbee1SArmin Le Grand  * Licensed to the Apache Software Foundation (ASF) under one
469ffbee1SArmin Le Grand  * or more contributor license agreements.  See the NOTICE file
569ffbee1SArmin Le Grand  * distributed with this work for additional information
669ffbee1SArmin Le Grand  * regarding copyright ownership.  The ASF licenses this file
769ffbee1SArmin Le Grand  * to you under the Apache License, Version 2.0 (the
869ffbee1SArmin Le Grand  * "License"); you may not use this file except in compliance
969ffbee1SArmin Le Grand  * with the License.  You may obtain a copy of the License at
1069ffbee1SArmin Le Grand  *
1169ffbee1SArmin Le Grand  *   http://www.apache.org/licenses/LICENSE-2.0
1269ffbee1SArmin Le Grand  *
1369ffbee1SArmin Le Grand  * Unless required by applicable law or agreed to in writing,
1469ffbee1SArmin Le Grand  * software distributed under the License is distributed on an
1569ffbee1SArmin Le Grand  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1669ffbee1SArmin Le Grand  * KIND, either express or implied.  See the License for the
1769ffbee1SArmin Le Grand  * specific language governing permissions and limitations
1869ffbee1SArmin Le Grand  * under the License.
1969ffbee1SArmin Le Grand  *
2069ffbee1SArmin Le Grand  *************************************************************/
2169ffbee1SArmin Le Grand 
2269ffbee1SArmin Le Grand // MARKER(update_precomp.py): autogen include statement, do not remove
2369ffbee1SArmin Le Grand #include "precompiled_svx.hxx"
2469ffbee1SArmin Le Grand #include <svx/sdrundomanager.hxx>
2569ffbee1SArmin Le Grand 
2669ffbee1SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
2769ffbee1SArmin Le Grand 
SdrUndoManager(sal_uInt16 nMaxUndoActionCount)2869ffbee1SArmin Le Grand SdrUndoManager::SdrUndoManager(sal_uInt16 nMaxUndoActionCount)
2969ffbee1SArmin Le Grand :   EditUndoManager(nMaxUndoActionCount),
3069ffbee1SArmin Le Grand     maEndTextEditHdl(),
313d9b0034SArmin Le Grand     mpLastUndoActionBeforeTextEdit(0),
323d9b0034SArmin Le Grand     mbEndTextEditTriggeredFromUndo(false)
3369ffbee1SArmin Le Grand {
3469ffbee1SArmin Le Grand }
3569ffbee1SArmin Le Grand 
~SdrUndoManager()3669ffbee1SArmin Le Grand SdrUndoManager::~SdrUndoManager()
3769ffbee1SArmin Le Grand {
3869ffbee1SArmin Le Grand }
3969ffbee1SArmin Le Grand 
Undo()4069ffbee1SArmin Le Grand sal_Bool SdrUndoManager::Undo()
4169ffbee1SArmin Le Grand {
423d9b0034SArmin Le Grand     if(isTextEditActive())
4369ffbee1SArmin Le Grand     {
443d9b0034SArmin Le Grand         sal_Bool bRetval(sal_False);
453d9b0034SArmin Le Grand 
4669ffbee1SArmin Le Grand         // we are in text edit mode
4769ffbee1SArmin Le Grand         if(GetUndoActionCount() && mpLastUndoActionBeforeTextEdit != GetUndoAction(0))
4869ffbee1SArmin Le Grand         {
4969ffbee1SArmin Le Grand             // there is an undo action for text edit, trigger it
5069ffbee1SArmin Le Grand             bRetval = EditUndoManager::Undo();
5169ffbee1SArmin Le Grand         }
5269ffbee1SArmin Le Grand         else
5369ffbee1SArmin Le Grand         {
5469ffbee1SArmin Le Grand             // no more text edit undo, end text edit
553d9b0034SArmin Le Grand             mbEndTextEditTriggeredFromUndo = true;
5669ffbee1SArmin Le Grand             maEndTextEditHdl.Call(this);
573d9b0034SArmin Le Grand             mbEndTextEditTriggeredFromUndo = false;
5869ffbee1SArmin Le Grand         }
5969ffbee1SArmin Le Grand 
603d9b0034SArmin Le Grand         return bRetval;
613d9b0034SArmin Le Grand     }
623d9b0034SArmin Le Grand     else
6369ffbee1SArmin Le Grand     {
6469ffbee1SArmin Le Grand         // no undo triggered up to now, trigger local one
653d9b0034SArmin Le Grand         return SfxUndoManager::Undo();
6669ffbee1SArmin Le Grand     }
6769ffbee1SArmin Le Grand }
6869ffbee1SArmin Le Grand 
Redo()6969ffbee1SArmin Le Grand sal_Bool SdrUndoManager::Redo()
7069ffbee1SArmin Le Grand {
7169ffbee1SArmin Le Grand     sal_Bool bRetval(sal_False);
7269ffbee1SArmin Le Grand 
733d9b0034SArmin Le Grand     if(isTextEditActive())
7469ffbee1SArmin Le Grand     {
7569ffbee1SArmin Le Grand         // we are in text edit mode
7669ffbee1SArmin Le Grand         bRetval = EditUndoManager::Redo();
7769ffbee1SArmin Le Grand     }
7869ffbee1SArmin Le Grand 
7969ffbee1SArmin Le Grand     if(!bRetval)
8069ffbee1SArmin Le Grand     {
8169ffbee1SArmin Le Grand         // no redo triggered up to now, trigger local one
8269ffbee1SArmin Le Grand         bRetval = SfxUndoManager::Redo();
8369ffbee1SArmin Le Grand     }
8469ffbee1SArmin Le Grand 
8569ffbee1SArmin Le Grand     return bRetval;
8669ffbee1SArmin Le Grand }
8769ffbee1SArmin Le Grand 
Clear()88*31b2f7b2SArmin Le Grand void SdrUndoManager::Clear()
89*31b2f7b2SArmin Le Grand {
90*31b2f7b2SArmin Le Grand     if(isTextEditActive())
91*31b2f7b2SArmin Le Grand     {
92*31b2f7b2SArmin Le Grand         while(GetUndoActionCount() && mpLastUndoActionBeforeTextEdit != GetUndoAction(0))
93*31b2f7b2SArmin Le Grand         {
94*31b2f7b2SArmin Le Grand             RemoveLastUndoAction();
95*31b2f7b2SArmin Le Grand         }
96*31b2f7b2SArmin Le Grand 
97*31b2f7b2SArmin Le Grand         // urgently needed: RemoveLastUndoAction does NOT correct the Redo stack by itself (!)
98*31b2f7b2SArmin Le Grand         ClearRedo();
99*31b2f7b2SArmin Le Grand     }
100*31b2f7b2SArmin Le Grand     else
101*31b2f7b2SArmin Le Grand     {
102*31b2f7b2SArmin Le Grand         // call parent
103*31b2f7b2SArmin Le Grand         EditUndoManager::Clear();
104*31b2f7b2SArmin Le Grand     }
105*31b2f7b2SArmin Le Grand }
106*31b2f7b2SArmin Le Grand 
SetEndTextEditHdl(const Link & rLink)10769ffbee1SArmin Le Grand void SdrUndoManager::SetEndTextEditHdl(const Link& rLink)
10869ffbee1SArmin Le Grand {
10969ffbee1SArmin Le Grand     maEndTextEditHdl = rLink;
11069ffbee1SArmin Le Grand 
1113d9b0034SArmin Le Grand     if(isTextEditActive())
11269ffbee1SArmin Le Grand     {
11369ffbee1SArmin Le Grand         // text edit start, remember last non-textedit action for later cleanup
11469ffbee1SArmin Le Grand         mpLastUndoActionBeforeTextEdit = GetUndoActionCount() ? GetUndoAction(0) : 0;
11569ffbee1SArmin Le Grand     }
11669ffbee1SArmin Le Grand     else
11769ffbee1SArmin Le Grand     {
11869ffbee1SArmin Le Grand         // text edit ends, pop all textedit actions up to the remembered non-textedit action from the start
11969ffbee1SArmin Le Grand         // to set back the UndoManager to the state before text edit started. If that action is already gone
12069ffbee1SArmin Le Grand         // (due to being removed from the undo stack in the meantime), all need to be removed anyways
12169ffbee1SArmin Le Grand         while(GetUndoActionCount() && mpLastUndoActionBeforeTextEdit != GetUndoAction(0))
12269ffbee1SArmin Le Grand         {
12369ffbee1SArmin Le Grand             RemoveLastUndoAction();
12469ffbee1SArmin Le Grand         }
12569ffbee1SArmin Le Grand 
12669ffbee1SArmin Le Grand         // urgently needed: RemoveLastUndoAction does NOT correct the Redo stack by itself (!)
12769ffbee1SArmin Le Grand         ClearRedo();
12869ffbee1SArmin Le Grand 
12969ffbee1SArmin Le Grand         // forget marker again
13069ffbee1SArmin Le Grand         mpLastUndoActionBeforeTextEdit = 0;
13169ffbee1SArmin Le Grand     }
13269ffbee1SArmin Le Grand }
13369ffbee1SArmin Le Grand 
isTextEditActive() const1343d9b0034SArmin Le Grand bool SdrUndoManager::isTextEditActive() const
1353d9b0034SArmin Le Grand {
1363d9b0034SArmin Le Grand     return maEndTextEditHdl.IsSet();
1373d9b0034SArmin Le Grand }
1383d9b0034SArmin Le Grand 
13969ffbee1SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
14069ffbee1SArmin Le Grand // eof
141