void UmlFragment::write_ref(FileOut & out, UmlItem * diagram, Q3PtrList< UmlSequenceMessage > & msgs) { static int rank = 0; out.indent(); out << "<fragment xmi:type=\"uml:InteractionUse\""; out.id_prefix(diagram, "INTERACTIONUSE", ++rank); const Q3PtrVector<UmlClassInstanceReference> & v = UmlBaseFragment::covered(); unsigned n; unsigned index; n = v.count(); if (n != 0) { out << " covered=\""; index = 0; for (;;) { out.ref_only(diagram, v.at(index)->lifeline()); if (++index == n) break; out << " "; } out << '"'; } UmlDiagram * d = refer(); if (d != 0) { switch (d->kind()) { case aSequenceDiagram: case aCollaborationDiagram: out.ref(d, "refersTo", "INTERACTION_"); if (arguments().isEmpty()) out << "/>\n"; else { static int rank = 0; out << ">\n"; out.indent(); out << "\t<argument xmi:type=\"uml:OpaqueExpression\""; out.id_prefix(d, "INTER_ARG_EXPR_", ++rank); out << ">\n"; out.indent(); out << "\t\t<body>"; out.quote(arguments()); out << "</body>\n"; out.indent(); out << "\t</argument>\n"; out.indent(); out << "</fragment>\n"; } break; default: out << "/>\n"; break; } } else out << "/>\n"; // remove internal messages and compartment const Q3PtrVector<UmlFragmentCompartment> & subs = compartments(); n = subs.size(); for (index = 0; index != n; index += 1) subs.at(index)->bypass(msgs); }
void UmlFragment::write(FileOut & out, UmlItem * diagram, Q3PtrList<UmlSequenceMessage> & msgs) { WrapperStr oper = name(); if (oper == "ref") write_ref(out, diagram, msgs); else { if ((oper != "alt") && (oper != "opt") && (oper != "loop") && (oper != "break") && (oper != "par") && (oper != "seq") && (oper != "strict") && (oper != "neg") && (oper != "critical") && (oper != "assert") && (oper != "ignore") && (oper != "consider")) oper = ""; else { static int rank = 0; out.indent(); out << "<fragment xmi:type=\"uml:CombinedFragment\""; out.id_prefix(diagram, "COMBINEDFRAGMENT", ++rank); if (! covered.isEmpty()) { out << " covered=\""; UmlClassInstanceReference * lifeline = covered.first(); for (;;) { out.ref_only(diagram, lifeline->lifeline()); lifeline = covered.next(); if (lifeline == 0) break; out << " "; } out << '"'; } out << " interactionOperator=\"" << oper.operator QString() << "\">\n"; out.indent(+1); } const Q3PtrVector<UmlFragmentCompartment> & subs = compartments(); unsigned n = subs.size(); for (unsigned i = 0; i != n; i += 1) subs.at(i)->write(out, diagram, msgs, oper); if (!oper.isEmpty()) { out.indent(-1); out.indent(); out << "</fragment>\n"; } } }