#include "UmlClass.h"
#include "UmlOperation.h"
#include "CppSettings.h"
#include "UmlCom.h"
#include "UmlClassView.h"
#include "UmlDeploymentView.h"
#include "UmlArtifact.h"
void UmlClass::defaultDef() {
if (cppDecl().isEmpty())
set_CppDecl(CppSettings::classDecl());
setUsed();
}
UmlOperation * UmlClass::trigger(QCString s, UmlClass * machine, UmlClass * anystate) {
UmlOperation * tr;
bool completion = (s == "_completion");
bool create = (s == "create");
if (!completion) {
// the trigger for the user
if (((tr = (UmlOperation *) machine->getChild(anOperation, s)) == 0) &&
((tr = UmlBaseOperation::create(machine, s)) == 0)) {
UmlCom::trace("Error : can't create operation '" + s + "' in class '"
+ machine->name() + "'
");
throw 0;
}
if (! tr->isManaged()) {
tr->defaultDef();
tr->setType("bool", "${type}");
if (!create)
tr->set_CppBody("\
if (_current_state != 0) {\n\
#ifdef VERBOSE_STATE_MACHINE\n\
puts(\"DEBUG : fire trigger " + s + "\");\n\
#endif\n\
_current_state->" + s + "(*this);\n\
}\n\
return (_current_state != 0);\n");
tr->managed();
tr->setComment("the operation you call to signal the event " + s);
}
else
tr->setUsed();
// the bypass trigger at the anystate level
if (((tr = (UmlOperation *) anystate->getChild(anOperation, s)) == 0) &&
((tr = UmlBaseOperation::create(anystate, s)) == 0)) {
UmlCom::trace("Error : can't create operation '" + s + "' in class '"
+ anystate->name() + "'
");
throw 0;
}
if (! tr->isManaged()) {
tr->defaultDef();
tr->set_isCppVirtual(TRUE);
tr->setType("void", "${type}");
if (tr->params().isEmpty())
tr->addParam(0, InputOutputDirection, "stm", machine);
if (create)
tr->setParams("${t0} &");
else {
tr->setParams("${t0} & ${p0}");
// the trigger is not managed, gives it at the upper level
tr->set_CppBody(" " + anystate->name() + " * st = _upper(stm);\n\n"
" if (st != 0)\n"
" st->" + s + "(stm);\n"
"#ifdef VERBOSE_STATE_MACHINE\n"
" else\n"
" puts(\"DEBUG : transition " + s + " not expected\");\n"
"#endif\n");
tr->setComment("the current state doesn't manage the event "
+ s + ", give it to the upper state");
}
tr->managed();
}
else
tr->setUsed();
}
// the trigger for the class
if (((tr = (UmlOperation *) getChild(anOperation, s)) == 0) &&
((tr = UmlBaseOperation::create(this, s)) == 0)) {
UmlCom::trace("Error : can't create operation '" + s + "' in class '"
+ name() + "'
");
throw 0;
}
tr->defaultDef();
tr->set_isCppVirtual(TRUE);
if (tr->params().isEmpty())
tr->addParam(0, InputOutputDirection, "stm", machine);
tr->setParams("${t0} & ${p0}");
if (completion)
tr->setType("bool", "${type}");
else {
tr->setType("void", "${type}");
tr->setComment("to manage the event " + s);
}
return tr;
}