📄 esddiagram.c
字号:
} return shape;}Line *ESDDiagram::CreateLine(Edge* edge, GShape *from, GShape *to, List<Point*> *l) { Grafport *g = GetDiagramViewer()->GetGrafport(); ShapeView *v = GetDiagramViewer()->GetCurView(); Line* line = 0; if (GetLineType()== Code::C2R2_LINE) line = new C2R2Line(v, g, from, to, l, IsCurve()); else if (GetLineType()== Code::SSD_R2LINE) line = new SSDR2Line(v, g, from, to, l, IsCurve()); else if (GetLineType()== Code::SSD_RCLINE) line = new SSDRCLine(v, g, from, to, l, IsCurve()); else if (GetLineType()== Code::LINE) line = new Line(v, g, from, to, l, IsCurve()); else error( "%s, line %d: impl error: " "edge shape type does not exist\n", __FILE__, __LINE__); if (check(line)) { line->SetSubject(edge); line->SetTextShape(); line->SetEnd1(GetLineEnd1()); line->SetEnd2(GetLineEnd2()); if (GetEdgeType()==Code::SSD_GENERALIZATION_EDGE) { if (to->GetClassType()==Code::MINI_ELLIPSE) line->SetEnd2(LineEnd::EMPTY); } if (GetEdgeType()==Code::COMMENT_LINK || GetEdgeType()==Code::SSD_PARTICIPANT_LINK_EDGE) line->SetFixedName(True); } return line;}void ESDDiagram::UpdateNodeType(int num) { ((DiagramWindow *)GetMainWindow())->SetNodeName(num); switch (num) { case 1: SetNodeType(Code::SSD_CLASS_NODE); SetNodeShapeType(Code::SSD_SINGLE_CLASS_BOX); SetNodeLineStyle(LineStyle::SOLID); break; case 2: SetNodeType(Code::SSD_CLASS_NODE); SetNodeShapeType(Code::SSD_DOUBLE_CLASS_BOX); SetNodeLineStyle(LineStyle::SOLID); break; case 3: SetNodeType(Code::NOTE); SetNodeShapeType(Code::NOTE_BOX); SetNodeLineStyle(LineStyle::SOLID); break; case 4: SetNodeType(Code::SSD_ASSOCIATION_NODE); SetNodeShapeType(Code::DIAMOND); SetNodeLineStyle(LineStyle::SOLID); break; case 5: SetNodeType(Code::SSD_GENERALIZATION_NODE); SetNodeShapeType(Code::MINI_ELLIPSE); SetNodeLineStyle(LineStyle::SOLID); break; case 6: SetNodeType(Code::COMMENT); SetNodeShapeType(Code::TEXT_BOX); SetNodeLineStyle(LineStyle::INVISIBLE); break; default: error("%s, line %d: impl error: " "unknown node type selected\n", __FILE__,__LINE__); }}void ESDDiagram::UpdateEdgeType(int num) { ((DiagramWindow *)GetMainWindow())->SetEdgeName(num); switch(num) { case 1: SetEdgeType(Code::SSD_BINARY_ASSOCIATION_EDGE); SetLineType(Code::C2R2_LINE); SetEdgeLineStyle(LineStyle::SOLID); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::EMPTY); break; case 2: SetEdgeType(Code::SSD_PARTICIPANT_LINK_EDGE); SetLineType(Code::SSD_RCLINE); SetEdgeLineStyle(LineStyle::SOLID); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::EMPTY); break; case 3: SetEdgeType(Code::COMMENT_LINK); SetLineType(Code::LINE); SetEdgeLineStyle(LineStyle::WIDE_DOTTED); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::EMPTY); break; case 4: SetEdgeType(Code::SSD_ASSOCIATION_LINK_EDGE); SetLineType(Code::LINE); SetEdgeLineStyle(LineStyle::DASHED); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::EMPTY); break; case 5: SetEdgeType(Code::SSD_GENERALIZATION_EDGE); SetLineType(Code::LINE); SetEdgeLineStyle(LineStyle::SOLID); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::WHITE_TRIANGLE); break; default: error("%s, line %d: impl error: " "unknown edge type selected\n", __FILE__,__LINE__); }}bool ESDDiagram::SetText(TextShape *t, const string *s) { const string *d = t->GetDescription(); Subject *subj = t->GetParent()->GetSubject(); if (*d == "Attribute" && subj->GetClassType()==Code::SSD_CLASS_NODE) return SetAttribute((StringListNode*)subj, s, t->GetSequence()); else if (*d == "Role Name" && subj->GetClassType()==Code::SSD_PARTICIPANT_LINK_EDGE) return SetRoleName(subj, s, t->GetSequence()); else return ERDiagram::SetText(t, s);}bool ESDDiagram::SetRoleName(Subject *subject, const string *s, unsigned nr) { List<GShape *> shapes; GetDiagramViewer()->GetShapes(subject, &shapes); bool succes = True; if (subject->GetClassType() == Code::SSD_PARTICIPANT_LINK_EDGE) { succes = ((SSDParticipantLinkEdge *)subject)->SetRoleName(s); } if (!succes) { string txt = "'" + *s + "' is not a possible role name"; ShowDialog(MessageDialog::ERROR, "Error", &txt); return False; } if (check(shapes.first())) { do { Shape *shape = shapes.cur(); if (shape->GetClassType()==Code::SSD_R2LINE) { if (nr == 1) ((SSDR2Line *)shape)->UpdateTextShape1(s); else ((SSDR2Line *)shape)->UpdateTextShape2(s); } else if (shape->GetClassType()==Code::SSD_RCLINE) ((SSDRCLine *)shape)->UpdateTextShape2(s); } while (shapes.next()); } else return False; return True;}void ESDDiagram::MakeErrorMessage(StringListNode *, StringListNode::StringErrorType result, const string *s, string *txt) { if (result == StringListNode::STRING_SYNTAX_ERROR) *txt += "syntax error: '" + *s + "'"; else if (result == StringListNode::STRING_ALREADY_EXISTS) *txt += "'" + *s + "' already exists";}bool ESDDiagram::SetAttribute(StringListNode *node, const string *s, unsigned nr) { List <GShape *> shapes; GetDiagramViewer()->GetShapes(node, &shapes); unsigned m = nr; // split string in different strings (separated by newline). // each string becomes a new attribute. string ss(*s); char *str = (char *)ss.getstr(); char *x = strtok(str, "\r"); char empty[2] = ""; if (x == 0) x = empty; while (x != 0) { string *ns = new string(x); bool update = True; StringListNode::StringErrorType result; if (m == nr) result = node->SetString(ns, m, True); else { // m != r result = node->SetString(ns, m, False); update = False; } string txt; MakeErrorMessage(node, result, ns, &txt); if (result != StringListNode::STRING_OK) { ShowDialog(MessageDialog::ERROR, "Error", &txt); // delete the newly created attributes. *ns = ""; for (shapes.first(); !shapes.done(); shapes.next()) { int type = shapes.cur()->GetClassType(); if (type != Code::BOX && type != Code::SSD_SINGLE_CLASS_BOX) { DoubleBox *db = (DoubleBox *)(shapes.cur()); if (db->NrLabels()-1 == m) db->UpdateLabel(ns, m, update); } } delete ns; return False; } // update the double box shapes. for (shapes.first(); !shapes.done(); shapes.next()) { int type = shapes.cur()->GetClassType(); if (type != Code::BOX && type != Code::SSD_SINGLE_CLASS_BOX) ((DoubleBox *)shapes.cur())->UpdateLabel(ns, m, update); } if (!shapes.first()) { error( "%s, line %d: impl error: " "shape does not exist!\n", __FILE__, __LINE__); return False; } m++; x = strtok(0, "\r"); delete ns; } return True;}void ESDDiagram::CheckDocument() { chkbuf = ""; unsigned total = 0; total += ssdChecks->CheckDoubleNamelessEdges( Code::SSD_BINARY_ASSOCIATION_EDGE, Code::SSD_CLASS_NODE, Code::SSD_CLASS_NODE, chkbuf); // Check that object classes are named. total += ssdChecks->CheckNamelessNodes(Code::SSD_CLASS_NODE, chkbuf); total += ssdChecks->CheckNamelessNodes(Code::SSD_ASSOCIATION_NODE, chkbuf); // double nodes can occur after cut-copy-paste total += ssdChecks->CheckDoubleNodes(Code::SSD_CLASS_NODE, chkbuf); ReportCheck(total, &chkbuf);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -