/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2010-2012 University of Bonn. All rights reserved.
*
*
* This file is part of MoleCuilder.
*
* MoleCuilder is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* MoleCuilder is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MoleCuilder. If not, see .
*/
/*
* Action.cpp
*
* Created on: Dec 8, 2009
* Author: crueger
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
#include "CodePatterns/MemDebug.hpp"
#include
#include
#include
#include "Actions/Action.hpp"
#include "Actions/ActionExceptions.hpp"
#include "Actions/ActionQueue.hpp"
#include "Actions/ActionRegistry.hpp"
#include "UIElements/Dialog.hpp"
#include "CodePatterns/Assert.hpp"
#include "CodePatterns/MemDebug.hpp"
#include "UIElements/UIFactory.hpp"
#include "CodePatterns/Log.hpp"
#include "CodePatterns/Verbose.hpp"
using namespace MoleCuilder;
ActionState::ptr getEmptyState() {
return ActionState::ptr(Memory::ignore(new ActionState()));
}
void Action::removeStaticStateEntities()
{
Action::success.reset();
Action::failure.reset();
}
void Action::createStaticStateEntities()
{
Action::success = getEmptyState();
Action::failure = getEmptyState();
}
// An empty state to indicate success, these are (de)initialized by ActionHistory
ActionState::ptr Action::success;
ActionState::ptr Action::failure;
Action::Action(const ActionTrait &_Traits) :
Traits(_Traits)
{}
Action::~Action()
{}
const string Action::getName() const
{
return Traits.getName();
}
const std::string Action::help() const
{
std::stringstream outputstream;
outputstream << "Description for Action '" << getName() << "': " << Traits.getDescription()
<< std::endl;
if (!Traits.hasOption(getName())) {
outputstream << "\tNote that this Action does not take an argument." << std::endl;
}
outputstream << "Options available for action '" << getName() << "':" << std::endl;
for (ActionTrait::options_const_iterator iter = Traits.getBeginIter();
iter != Traits.getEndIter();
++iter) {
outputstream << "Option '" << iter->first << "':" << std::endl;
outputstream << "\tDescription: " << iter->second->getDescription() << "." << std::endl;
outputstream << "\tArgument's type: " << iter->second->getTypeName() << "." << std::endl;
outputstream << "\tDefault value: ";
if (iter->second->hasDefaultValue()) {
outputstream << "Yes, is '" << iter->second->getDefaultValue() << "'";
} else {
outputstream << "None";
}
outputstream << "." << std::endl;
}
return outputstream.str();
}
void Action::prepare(enum QueryOptions flag)
{
// fill with
if (flag == Interactive) {
Dialog* dialog = createDialog();
if (dialog->hasQueries()) {
if (!dialog->display())
// dialog error or aborted -> throw exception
throw ActionFailureException() << ActionNameString(getName());
}
delete(dialog);
}
}
Dialog * Action::createDialog(){
Dialog *dialog = UIFactory::getInstance().makeDialog(Traits.getName());
return fillDialog(dialog);
}
void Action::call(){
if(!isActive()){
return;
}
ActionState::ptr state = Action::failure;
startTimer();
try {
state = performCall();
} catch (ParameterException &e) {
if( const std::string *name=boost::get_error_info(e) )
ELOG(1, "The following parameter value is not valid: " << *name << ".");
state = Action::failure;
}
endTimer();
if (shouldUndo() && state != Action::failure) {
if (canUndo()) {
ActionQueue::getInstance().addElement(this,state);
}
// else{
// ActionQueue::getInstance().clear();
// }
}
// throw an exception that can be caught in case of failure
if (state == Action::failure)
throw ActionFailureException() << ActionNameString(getName());
}
ActionState::ptr Action::undo(ActionState::ptr _state) {
// forward to private virtual
return performUndo(_state);
}
ActionState::ptr Action::redo(ActionState::ptr _state) {
// forward to private virtual
return performRedo(_state);
}
void Action::insertAction(Action *_action, enum Action::QueryOptions state)
{
ActionQueue::getInstance().insertAction(_action, state);
}
bool Action::isActive() const {
return true;
}
void Action::pushStatus(const std::string& _msg)
{
ActionQueue::getInstance().pushStatus(_msg);
}