Esempio n. 1
0
void UmlTransition::generate(UmlClass * machine, UmlClass * anystate, UmlState * state) {
  if (_already_managed)
    return;
    
  QCString s = triggerName();
  
  // group transitions having the same trigger
  const QVector<UmlItem> ch = parent()->children();
  unsigned index = ch.findRef(this);
  QList<UmlTransition> trs;
  UmlTransition * tr_no_guard = 0;
  
  if (cppGuard().isEmpty())
    tr_no_guard = this;
  else
    trs.append(this);
  
  while (++index != ch.count()) {
    if ((ch[index]->kind() == aTransition) &&
	(((UmlTransition *) ch[index])->triggerName() == s)) {
      if (!((UmlTransition *) ch[index])->cppGuard().isEmpty())
	trs.append((UmlTransition *) ch[index]);
      else if (tr_no_guard != 0) {
	UmlCom::trace("Error : several transitions from '" + parent()->name()
		      + "' don't have guard");
	throw 0;
      }
      else
	tr_no_guard = (UmlTransition *) ch[index];
      
      ((UmlTransition *) ch[index])->_already_managed = TRUE;
    }
  }

  if (tr_no_guard != 0)
    // place it at end
    trs.append(tr_no_guard);
    
  // made the trigger

  UmlOperation * trg = state->assocClass()->trigger(s, machine, anystate);
  QCString body;
  
  if (s == "create") {
    // manage entry
    if (!state->cppEntryBehavior().isEmpty())
      body = "  _doentry(stm);\n";
  }

  if (!state->cppDoActivity().isEmpty())
    // state do activity before each event except create
    body += "  _do(stm);\n";
    
  bool completion = (s == "_completion");

  if (!completion && state->isLeaf() && state->hasCompletion())
    // manage completion
    body += "  if (_completion(stm)) return;\n";
    
  UmlTransition::generate(trs, machine, anystate, state,
			  body, "  ", completion);
  
  trg->set_CppBody(body);
}