BasicData * DiagramItem::add_relation(UmlCode t, DiagramItem * end) { UmlCanvas * canvas = the_canvas(); canvas->freeze_draw_all_relations(); BasicData * result = get_bn()->add_relation(t, end->get_bn()); canvas->unfreeze_draw_all_relations(); return result; }
void ArtifactCanvas::post_connexion(UmlCode action, DiagramItem * dest) { if (action == UmlContain) { UmlCanvas * canvas = the_canvas(); canvas->freeze_draw_all_relations(); ((ArtifactData *) browser_node->get_data()) ->associate((BrowserArtifact *) ((ArtifactCanvas *) dest)->browser_node); canvas->unfreeze_draw_all_relations(); } }
void ComponentDiagramView::add_marked_elements(const QPoint& p, Q3PtrDict<DiagramItem> & drawn) { QApplication::setOverrideCursor(Qt::waitCursor); history_save(); history_protected = TRUE; int xmax = canvas()->width() - Diagram_Margin; int ymax = canvas()->height() - Diagram_Margin; int x = p.x(); int y = p.y(); int future_y = y; const Q3PtrList<BrowserNode> & l = BrowserNode::marked_nodes(); Q3PtrListIterator<BrowserNode> it(l); BrowserNode * bn; for (; (bn = it.current()) != 0; ++it) { if (drawn[bn->get_data()] == 0) { DiagramCanvas * dc; switch (bn->get_type()) { case UmlComponent: dc = new ComponentCanvas(bn, the_canvas(), x, y); break; case UmlPackage: dc = new PackageCanvas(bn, the_canvas(), x, y, 0); break; default: continue; } drawn.replace(dc->get_bn()->get_data(), dc); if ((x + dc->width()) > xmax) dc->move(x = Diagram_Margin, y = future_y); if (y + dc->height() > ymax) { dc->move(x = Diagram_Margin, y = Diagram_Margin); future_y = y + dc->height() + Diagram_Margin; } else { int bot = y + dc->height() + Diagram_Margin; if (bot > future_y) future_y = bot; } x = x + dc->width() + Diagram_Margin; dc->show(); dc->upper(); } } UmlCanvas * cnv = (UmlCanvas *) canvas(); if (! cnv->must_draw_all_relations()) { for (it.toFirst(); (bn = it.current()) != 0; ++it) { if ((drawn[bn->get_data()] == 0) && IsaSimpleRelation(bn->get_type())) SimpleRelationCanvas::drop(bn, cnv, drawn); } } canvas()->update(); history_protected = FALSE; window()->package_modified(); QApplication::restoreOverrideCursor(); }
void ActivityContainerCanvas::prepare_for_move(bool on_resize) { if (! on_resize) { // select all sub nodes Q3CanvasItemList all = canvas()->allItems(); Q3CanvasItemList::Iterator cit; UmlCanvas * canvas = the_canvas(); for (cit = all.begin(); cit != all.end(); ++cit) { if ((*cit)->visible() && !(*cit)->selected()) { DiagramItem * di = QCanvasItemToDiagramItem(*cit); if ((di != 0) && (di->get_bn() != 0) && (((BrowserNode *) di->get_bn()->parent()) == browser_node)) { // must look at the type because some canvas items have browser_node // attr set to the diagram and the parent of the diagram is the activity switch (di->type()) { case UmlActivityObject: case UmlActivityAction: case UmlActivityPartition: case InitialAN: case FlowFinalAN: case ActivityFinalAN: case DecisionAN: case MergeAN: case ForkAN: case JoinAN: case UmlExpansionRegion: case UmlInterruptibleActivityRegion: canvas->select(*cit); ((DiagramCanvas *) di)->prepare_for_move(on_resize); break; default: break; } } } } // select points on lines having the two extremities selected or // connecting pin/parameter/expansion node of element selected for (cit = all.begin(); cit != all.end(); ++cit) { if ((*cit)->visible() && !(*cit)->selected() && isa_arrow(*cit)) { ArrowCanvas * ar = (ArrowCanvas *) *cit; DiagramItem * b; DiagramItem * e; ar->extremities(b, e); if (!b->isSelected() || !e->isSelected()) { DiagramItem * start = ar->get_start(); DiagramItem * dest = ar->get_end(); if ((start->isSelected() || indirectly_selected(start)) && (dest->isSelected() || indirectly_selected(dest))) { while (b->type() == UmlArrowPoint) { canvas->select((ArrowPointCanvas *) b); ar = ((ArrowPointCanvas *) b)->get_other(ar); ar->extremities(b, e); } ar = (ArrowCanvas *) *cit; ar->extremities(b, e); while (e->type() == UmlArrowPoint) { canvas->select((ArrowPointCanvas *) e); ar = ((ArrowPointCanvas *) e)->get_other(ar); ar->extremities(b, e); } } } } } } }
void OdClassInstCanvas::compute_size() { UmlCanvas * canvas = the_canvas(); ClassInstanceData * data = (ClassInstanceData *) browser_node->get_data(); used_color = (itscolor == UmlDefaultColor) ? canvas->browser_diagram()->get_color(UmlClass) : itscolor; switch (show_stereotype_properties) { case UmlYes: show_properties = TRUE; break; case UmlNo: show_properties = FALSE; break; default: // right arg set by the diagram itself show_properties = canvas->browser_diagram()->get_show_stereotype_properties(); } QFontMetrics fm(canvas->get_font(UmlNormalUnderlinedFont)); double zoom = canvas->zoom(); const int two = (int)(2 * zoom); int wi, he; horiz = TRUE; if (!get_name().isEmpty()) { switch (write_horizontally) { case UmlYes: horiz = TRUE; break; case UmlNo: horiz = FALSE; break; default: // right get_classinstwritehorizontally arg set by the diagram itself horiz = canvas->browser_diagram()->get_classinstwritehorizontally(); } } he = fm.height() + two + two; used_show_context_mode = (show_context_mode == DefaultShowContextMode) ? canvas->browser_diagram()->get_classinstshowmode() : show_context_mode; if (horiz) wi = fm.width(full_name()); else { he += fm.height(); int w = fm.width(get_name() + ":"); wi = fm.width(data->get_class()->contextual_name(used_show_context_mode)); if (w > wi) wi = w; } const Q3ValueList<SlotAttr> & attributes = data->get_attributes(); if (! attributes.isEmpty()) { Q3ValueList<SlotAttr>::ConstIterator it = attributes.begin(); QString egal = " = "; do { QString s = (*it).att->get_name() + egal + (*it).value; int w = fm.width(s); if (w > wi) wi = w; ++it; } while (it != attributes.end()); he += (fm.height() + two) * attributes.count() + two + two; } if (used_color != UmlTransparent) { const int shadow = canvas->shadow(); wi += shadow; he += shadow; } const int eight = (int)(8 * zoom); wi += (((ClassData *) data->get_class()->get_data())->get_is_active()) ? eight * 3 : eight; int minw = (int)(zoom * CLASSINST_CANVAS_MIN_SIZE); if (wi < minw) wi = minw; // force odd width and height for line alignment DiagramCanvas::resize(wi | 1, he | 1); }
void ColDiagramView::read(char * st, char * k) { UmlCanvas * canvas = the_canvas(); // reads first the instances, package, fragment notes, icons text and images while (CodClassInstCanvas::read(st, canvas, k) || NoteCanvas::read(st, canvas, k) || TextCanvas::read(st, canvas, k) || IconCanvas::read(st, canvas, k) || PackageCanvas::read(st, canvas, k) || FragmentCanvas::read(st, canvas, k) || ImageCanvas::read(st, canvas, k)) k = read_keyword(st); // then reads links selflink and dirs (without messages) while (CodLinkCanvas::read(st, canvas, k) || // updates k CodSelfLinkCanvas::read(st, canvas, k) || // updates k CodDirsCanvas::read(st, canvas, k)) // updates k ; // then read messages if (!strcmp(k, "msgs")) ColMsg::read(st, msgs, canvas); else if (strcmp(k, "no_msg")) wrong_keyword(k, "msgs/no_msg"); k = read_keyword(st); // then show/update msgs Q3CanvasItemList items = canvas->allItems(); Q3CanvasItemList::Iterator it; for (it = items.begin(); it != items.end(); ++it) { DiagramItem * di = QCanvasItemToDiagramItem(*it); if (di != 0) { switch (di->type()) { case UmlSelfLink: ((CodSelfLinkCanvas *) di)->update_msgs(); break; case UmlLinkDirs: ((CodDirsCanvas *) di)->update_msgs(); break; default: // to avoid warning break; } } } // then reads anchors while (ArrowCanvas::read(st, canvas, k)) k = read_keyword(st); if (!strcmp(k, "preferred_whz") || !strcmp(k, "prefered_whz")) { preferred_size.setWidth(read_unsigned(st)); preferred_size.setHeight(read_unsigned(st)); preferred_zoom = read_double(st); k = read_keyword(st); } if (strcmp(k, "end")) wrong_keyword(k, "end"); }