Exemple #1
0
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;
}
Exemple #2
0
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();
  }
}
Exemple #3
0
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");
}