コード例 #1
0
ファイル: RelationData.cpp プロジェクト: harmegnies/douml
void RelationData::unidir_change_dest(BrowserNode * e)
{
    // called by BrowserClass::plug_out_conversion()
    disconnect(end_removed_from->get_data(), SIGNAL(deleted()),
               this, SLOT(end_deleted()));
    end_removed_from = e;
    connect(end_removed_from->get_data(), SIGNAL(deleted()),
            this, SLOT(end_deleted()));
}
コード例 #2
0
SimpleRelationData * SimpleRelationData::read(char * & st)
{
  SimpleRelationData * result =
    new SimpleRelationData(relation_type(read_keyword(st), TRUE));
  char * k = read_keyword(st);
  
  result->BasicData::read(st, k);	// updates k

  if (strcmp(k, "on"))
    wrong_keyword(k, "on");
  
  k = read_keyword(st);
  
  // note : BrowserArtifact::read get Component def on component -> artifact
  if (((result->end = BrowserArtifact::read(st, k, 0)) == 0) &&
      ((result->end = BrowserComponent::read(st, k, 0)) == 0) &&
      ((result->end = BrowserUseCase::read(st, k, 0)) == 0) &&
      ((result->end = BrowserPackage::read(st, k, 0, FALSE)) == 0) &&
      ((result->end = BrowserDeploymentNode::read(st, k, 0)) == 0) &&
      ((result->end = BrowserActivity::read(st, k, 0)) == 0) &&
      ((result->end = BrowserActivityAction::read(st, k, 0)) == 0) &&
      ((result->end = BrowserActivityObject::read(st, k, 0)) == 0) &&
      ((result->end = BrowserClass::read(st, k, 0)) == 0))
    wrong_keyword(k, "a ref to a class, component, usecase, package, deployment node, activity, activity action or activity object");
  
  connect(result->end->get_data(), SIGNAL(deleted()),
	  result, SLOT(end_deleted()));
  
  return result;
}
コード例 #3
0
void TransitionData::set_start_end(BrowserTransition * s, BrowserNode * e) {
  browser_node = s;
  end = e;
  connect(e->get_data(), SIGNAL(deleted()), this, SLOT(end_deleted()));
  
  is_internal = (s->parent() == e);
}
コード例 #4
0
TransitionData * TransitionData::read(char * & st, char * & k)
{
  TransitionData * result = new TransitionData;
  
  result->BasicData::read(st, k);	// updates k

  if (strcmp(k, "on"))
    wrong_keyword(k, "on");
  
  k = read_keyword(st);
  
  if (((result->end = BrowserState::read(st, k, 0)) == 0) &&
      ((result->end = BrowserPseudoState::read(st, k, 0)) == 0) &&
      ((result->end = BrowserStateAction::read(st, k, 0)) == 0))
    wrong_keyword(k, "a ref to a state or action or pseudo state");
  
  connect(result->end->get_data(), SIGNAL(deleted()),
	  result, SLOT(end_deleted()));
  
  k = read_keyword(st);
  result->uml.read(st, k, "uml");		// update k
  result->cpp.read(st, k, "cpp");		// update k
  result->java.read(st, k, "java");		// update k
  
  return result;
}
コード例 #5
0
ファイル: RelationData.cpp プロジェクト: harmegnies/douml
RelationData::RelationData(const BrowserRelation * model,
                           BrowserRelation * r)
    : ClassMemberData((ClassMemberData *) model->get_data()),
      Labeled<RelationData>(all, 0), is_deleted(FALSE), is_unconsistent(FALSE)
{
    RelationData * md = (RelationData *) model->get_data();

    type = md->type;
    name = md->name;
    a = md->a;
    b = md->b;
    set_association(md->association);
    original_id = 0;

    if (md->start == model) {
        start = r;

        if (md->end_removed_from == 0) {
            // bi dir, self to model became self to r
            end = new BrowserRelation((md->get_end_class() == (BrowserClass *) model->parent())
                                      ? (BrowserClass *) r->parent() : md->get_end_class(),
                                      this);
            end_removed_from = 0;
        }
        else {
            // uni dir
            end = 0;
            end_removed_from = (md->end_removed_from == (BrowserClass *) model->parent())
                               ? (BrowserClass *) r->parent() : md->end_removed_from;
            connect(end_removed_from->get_data(), SIGNAL(deleted()),
                    this, SLOT(end_deleted()));
        }
    }
    else {
        // bi dir, self to model became self to r
        end = r;
        start = new BrowserRelation((md->get_start_class() == (BrowserClass *) model->parent())
                                    ? (BrowserClass *) r->parent() : md->get_start_class(),
                                    this);
        end_removed_from = 0;
    }

    if (get_start_class() == md->get_start_class())
        // to not have two times the same role name
        a.role = 0;

    if ((end != 0) && (get_end_class() == md->get_end_class()))
        // to not have two times the same role name
        b.role = 0;
}
コード例 #6
0
ファイル: RelationData.cpp プロジェクト: harmegnies/douml
bool RelationData::check_end_visibility()
{
    if (!navigable(end)) {
        if (end_removed_from == 0) {
            end_removed_from = end->extract();
            end = 0;
            connect(end_removed_from->get_data(), SIGNAL(deleted()),
                    this, SLOT(end_deleted()));
        }

        return FALSE;
    }

    if (end_removed_from != 0) {
        disconnect(end_removed_from->get_data(), SIGNAL(deleted()),
                   this, SLOT(end_deleted()));
        end = BrowserRelation::reinsert(end_removed_from, this);
        end_removed_from = 0;
        end->update_stereotype();
    }

    return TRUE;
}
コード例 #7
0
ファイル: RelationData.cpp プロジェクト: harmegnies/douml
BrowserRelation * RelationData::set_start_end(BrowserRelation * s, BrowserClass * e)
{
    start = s;

    if (! uni_directional(type))
        end = new BrowserRelation(e, this);
    else {
        end_removed_from = e;
        connect(e->get_data(), SIGNAL(deleted()), this, SLOT(end_deleted()));
    }

    if (a.uml_visibility == UmlDefaultVisibility) {
        QString st = ((BrowserClass *) s->parent())->get_stereotype();

        switch (type) {
        case UmlGeneralisation:
        case UmlRealize:
            a.uml_visibility = UmlPublic;

            if (GenerationSettings::cpp_get_default_defs())
                a.cpp_decl = (ClassDialog::cpp_stereotype(st) != "enum")
                             ? "${type}" : "";

            if (GenerationSettings::java_get_default_defs())
                a.java_decl = "${type}";

            if (GenerationSettings::php_get_default_defs())
                a.php_decl = "${type}";

            if (GenerationSettings::python_get_default_defs())
                a.python_decl = "${type}";

            if (GenerationSettings::idl_get_default_defs())
                a.idl_decl = (ClassDialog::idl_stereotype(st) != "enum")
                             ? "${type}" : "";

            break;

        case UmlDependency:
            if (GenerationSettings::cpp_get_default_defs())
                a.cpp_decl = "#include in source";

            if (GenerationSettings::php_get_default_defs())
                a.php_decl = "${type}";

            if (GenerationSettings::python_get_default_defs())
                a.python_decl = "${type}";

            break;

        default:
            a.uml_visibility =
                ((BrowserNode *) start->parent())->get_visibility(UmlRelations);
            default_decls(a, type,
                          ((BrowserNode *) start->parent())->get_data()->get_stereotype());
        }
    }

    if (end != 0) {
        if (b.uml_visibility == UmlDefaultVisibility)
            b.uml_visibility = e->get_visibility(UmlRelations);

        default_decls(b, type,
                      ((BrowserNode *) end->parent())->get_data()->get_stereotype());
    }
    else
        b.uml_visibility = end_removed_from->get_visibility(UmlRelations);

    return end;
}
コード例 #8
0
ファイル: RelationData.cpp プロジェクト: harmegnies/douml
RelationData * RelationData::read(char *& st, char *& k,
                                  BrowserRelation *& unconsistent)
{
    unconsistent = 0;

    RelationData * result;
    int id;

    if (!strcmp(k, "relation_ref")) {
        if ((result = all[id = read_id(st)]) == 0)
            result = new RelationData(UmlRelations/*!!*/, id);

        k = read_keyword(st);
        return result;
    }
    else if (!strcmp(k, "relation")) {
        if ((result = all[id = read_id(st)]) == 0)
            result = new RelationData(relation_type(read_keyword(st)), id);
        else if (result->type != UmlRelations) {
            // shared identifier
            result->set_unconsistent();
            unconsistent = result->start;
            result = new RelationData(relation_type(read_keyword(st)), id);
            result->set_unconsistent();
        }
        else {
            result->type = relation_type(read_keyword(st));
            result->name = default_name(result->type);

            if (result->start != 0) {
                // Created by RelationData::read_ref()
                // invalidate start/end to not delete result
                // when start/end will be deleted
                result->start->invalidate();
                result->end->invalidate();
            }
        }

        k = read_keyword(st);

        if (!strcmp(k, "name")) {
            result->name = read_string(st);
            k = read_keyword(st);
        }

        result->BasicData::read(st, k);	// updates k

        if (in_lib_import()) {
            result->original_id = id;

            if (! strcmp(k, "oid")) {
                // a sub lib is imported as a part of the imported lib
                (void) read_id(st);
                k = read_keyword(st);
            }
        }
        else if (! strcmp(k, "oid")) {
            result->original_id = read_id(st);
            k = read_keyword(st);
        }

        bool assoc = isa_association(result->type);

        if (strcmp(k, "a"))
            wrong_keyword(k, "a");

        read_role(result->a, assoc, st, k, result);		// updates k
        result->start = BrowserRelation::read_ref(st, k);

        read_keyword(st, "b");

        if (!RelationData::uni_directional(result->type)) {
            read_role(result->b, assoc, st, k, result);	// updates k
            result->end = BrowserRelation::read_ref(st, k);
            // 'end' may be read before 'start' : relation's type was unknown
            result->end->set_name(0);
            result->end->set_name(result->name);
        }
        else {
            k = read_keyword(st);

            if (!strcmp(k, "multiplicity")) {
                result->b.multiplicity = read_string(st);
                k = read_keyword(st);
            }
            else
                result->b.multiplicity = 0;

            if (strcmp(k, "parent"))
                wrong_keyword(k, "parent");

            result->end_removed_from = BrowserClass::read_ref(st);
            result->b.uml_visibility =
                ((BrowserNode *) result->end_removed_from->parent())->get_visibility(UmlRelations);
            connect(result->end_removed_from->get_data(), SIGNAL(deleted()),
                    result, SLOT(end_deleted()));
            result->end = 0;

            // manage old declarations
            switch (result->type) {
            case UmlRealize:
            case UmlGeneralisation:
                if (result->a.cpp_decl == "Generated")
                    result->a.cpp_decl = "${type}";

                if (result->a.java_decl == "Generated")
                    result->a.java_decl = "${type}";

                if (result->a.idl_decl == "Generated")
                    result->a.idl_decl = "${type}";

                break;

            case UmlDependency:
                if (!result->a.cpp_decl.isEmpty()) {
                    if (result->stereotype == "friend")
                        result->a.cpp_decl = "${type}";
                    else if ((result->a.cpp_decl == "Generated") ||
                             (result->a.cpp_decl == "${type}"))
                        result->a.cpp_decl = "#include in header";
                    else if ((result->a.cpp_decl == "#include in source") &&
                             (read_file_format() < 56))
                        IncludeToHeaderIfExternal.append(result);
                }

                break;

            default:
                break;
            }
        }

        k = read_keyword(st);

        AType t;

        if (!strcmp(k, "association_type") ||
            !strcmp(k, "association_explicit_type")) {
            t.read(st, "association_type", "association_explicit_type", k);
            result->set_association(t);
            k = read_keyword(st);
        }

        return result;
    }
    else
        return 0;
}
コード例 #9
0
void SimpleRelationData::set_start_end(BrowserSimpleRelation * s, BrowserNode * e) {
  browser_node = s;
  end = e;
  connect(e->get_data(), SIGNAL(deleted()), this, SLOT(end_deleted()));
}