⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 esddiagram.c

📁 这个工具集提供以下结构化分析和UML分析中所用的图形化绘图工具:ER-diagrams, data and event flow diagrams and state-transition diagr
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	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 + -