source: src/Actions/ActionHistory.cpp@ 463bfb

Candidate_v1.7.0 stable
Last change on this file since 463bfb was 780bfa, checked in by Frederik Heber <frederik.heber@…>, 2 months ago

FIX: FormatParserStorage did not add parser instance on SetOutput.

  • using the InputAction on an empty file would not write that file using the desired parser (judged from suffix) on exit because the respective was set as desired output but not instantiated (ParserPresent).
  • Property mode set to 100644
File size: 3.7 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * ActionHistory.cpp
25 *
26 * Created on: Mar 25, 2010
27 * Author: crueger
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35//#include "CodePatterns/MemDebug.hpp"
36
37#include "Actions/ActionHistory.hpp"
38
39#include "Actions/ActionExceptions.hpp"
40
41#include <iostream>
42
43#include "CodePatterns/Assert.hpp"
44
45using namespace MoleCuilder;
46
47
48ActionHistory::ActionHistory()
49{
50 Action::createStaticStateEntities();
51}
52
53ActionHistory::~ActionHistory()
54{
55 Action::removeStaticStateEntities();
56}
57
58void ActionHistory::undoLast(){
59 if (!hasUndo()){
60 LOG(1, "Undo performed when the undo-queue was empty.");
61 return;
62 }
63 //ASSERT(history.size(),"Undo performed when the undo-queue was empty");
64 HistoryElement elem = history.back();
65 LOG(1, "INFO: Undoing action " << elem.action->getName());
66 while ((!marked.empty()) && (marked.top() == &elem)) {
67 LOG(2, "DEBUG: Undoing marked item in ActionHistory, hence resetting mark.");
68 marked.pop();
69 }
70 history.pop_back();
71 ActionState::ptr newState = elem.action->undo(elem.state);
72 if (newState == Action::failure)
73 throw ActionFailureException() << ActionNameString(elem.action->getName());
74 yrotsih.push_back(HistoryElement(elem.action,newState));
75}
76
77void ActionHistory::redoLast(){
78 if (!hasRedo()){
79 LOG(1, "Redo performed when the redo-queue was empty.");
80 return;
81 }
82 //ASSERT(yrotsih.size(),"Redo performed when the redo-queue was empty");
83 HistoryElement elem = yrotsih.back();
84 LOG(1, "INFO: Redoing action " << elem.action->getName());
85 yrotsih.pop_back();
86 ActionState::ptr oldState = elem.action->redo(elem.state);
87 if (oldState == Action::failure)
88 throw ActionFailureException() << ActionNameString(elem.action->getName());
89 history.push_back(HistoryElement(elem.action,oldState));
90}
91
92bool ActionHistory::hasUndo(){
93 return history.size()>0;
94}
95
96bool ActionHistory::hasRedo(){
97 return yrotsih.size()>0;
98}
99
100void ActionHistory::setMark() {
101 HistoryElement * const mark = &(history.back());
102 if (mark == NULL) {
103 ELOG(2, "setMark - must not push NULL as element");
104 return;
105 }
106 marked.push(mark);
107}
108
109void ActionHistory::unsetMark() {
110 if (!marked.empty()) {
111 marked.pop();
112 } else {
113 ELOG(2, "unsetMark - stack is already empty.");
114 }
115}
116
117void ActionHistory::undoTillMark() {
118 if (marked.empty()) {
119 ELOG(2, "There is no undo mark, not undoing anything.");
120 } else {
121 const HistoryElement * const mark = marked.top();
122 while (mark != &(history.back()))
123 undoLast();
124 marked.pop();
125 }
126}
127
128void ActionHistory::addElement(Action* action,ActionState::ptr state){
129 yrotsih.clear();
130 history.push_back(HistoryElement(action,state));
131}
132
133void ActionHistory::clear(){
134 history.clear();
135 yrotsih.clear();
136}
137
138//void ActionHistory::init(){
139// ActionHistory *hist = new ActionHistory();
140// setInstance(hist);
141//}
142
143/****************** Contained actions *******************/
144
Note: See TracBrowser for help on using the repository browser.