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

📄 gddiagram.c

📁 这个工具集提供以下结构化分析和UML分析中所用的图形化绘图工具:ER-diagrams, data and event flow diagrams and state-transition diagr
💻 C
字号:
//////////////////////////////////////////////////////////////////////////////////// This file is part of Toolkit for Conceptual Modeling (TCM).// (c) copyright 1995, Vrije Universiteit Amsterdam.// Author: Frank Dehne (frank@cs.vu.nl).//// TCM is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// TCM is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with TCM; if not, write to the Free Software// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA// 02111-1307, USA.////////////////////////////////////////////////////////////////////////////////#include "gdgraph.h"#include "genericedge.h"#include "genericnode.h"#include "emptynode.h"#include "miniellipse.h"#include "blackdot.h"#include "box.h"#include "bullseye.h"#include "circle.h"#include "square.h"#include "notebox.h"#include "roundedbox.h"#include "ellipsedbox.h"#include "triangle.h"#include "hexagon.h"#include "horizontalbar.h"#include "verticalbar.h"#include "solidhorizontalbar.h"#include "solidverticalbar.h"#include "diamond.h"#include "line.h"#include "textbox.h"#include "comment.h"#include "stickman.h"#include "folder.h"#include "disk.h"#include "buildingblock.h"#include "cube.h"#include "subfolder.h"#include "gddiagram.h"#include "gdviewer.h"#include "gdwindow.h"#include "gdboundaryshape.h"#include "gdcontrollershape.h"#include "gdentityshape.h"const int GDDiagram::DOT_WIDTH = 8; GDDiagram::GDDiagram(Config *c, GDWindow *d, GDViewer *v, GDGraph *g): 		Diagram(c,d,v,g) {	UpdateNodeType(1);	UpdateEdgeType(1);}Thing *GDDiagram::CreateThing(int classNr) {	Grafport *g = GetDiagramViewer()->GetGrafport();	ShapeView *v = GetDiagramViewer()->GetCurView();	Thing *thing = 0;	switch ( classNr ) {	case Code::BOX:		thing = new Box(v, g, 0, 0); 		break;	case Code::SQUARE:		thing = new Square(v, g, 0, 0); 		break;	case Code::CIRCLE:		thing = new Circle(v, g, 0, 0); 		break;	case Code::ELLIPSE:		thing = new Ellipse(v, g, 0, 0); 		break;	case Code::STICKMAN:		thing = new StickMan(v, g, 0, 0); 		break;	case Code::TRIANGLE:		thing = new Triangle(v, g, 0, 0); 		break;	case Code::HEXAGON:		thing = new Hexagon(v, g, 0, 0); 		break;	case Code::HORIZONTAL_BAR:		thing = new HorizontalBar(v, g, 0, 0); 		break;	case Code::VERTICAL_BAR:		thing = new VerticalBar(v, g, 0, 0); 		break;	case Code::ROUNDED_BOX:		thing = new RoundedBox(v, g, 0, 0); 		break;	case Code::ELLIPSED_BOX:		thing = new EllipsedBox(v, g, 0, 0); 		break;	case Code::DIAMOND:		thing = new Diamond(v, g, 0, 0); 		break;	case Code::TEXT_BOX:		thing = new TextBox(v, g, 0, 0); 		break;	case Code::BLACK_DOT:		thing = new BlackDot(v, g, 0, 0); 		break;	case Code::BULLS_EYE:		thing = new BullsEye(v, g, 0, 0); 		break;	case Code::SOLID_HORIZONTAL_BAR:                thing = new SolidHorizontalBar(v, g, 0, 0);		break;	case Code::SOLID_VERTICAL_BAR:                thing = new SolidVerticalBar(v, g, 0, 0);		break;	case Code::NOTE_BOX:                thing = new NoteBox(v, g, 0, 0);		break;	case Code::BUILDING_BLOCK:                 thing = new BuildingBlock(v, g, 0, 0);		break;	case Code::CUBE:                 thing = new Cube(v, g, 0, 0);		break;	case Code::FOLDER:                 thing = new Folder(v, g, 0, 0);		break;	case Code::SUB_FOLDER:                 thing = new SubFolder(v, g, 0, 0);		break;	case Code::DISK:                 thing = new Disk(v, g, 0, 0);		break;	case Code::GD_BOUNDARY_SHAPE:		thing = new GDBoundaryShape(v, g, 0, 0);		break;	case Code::GD_CONTROLLER_SHAPE:		thing = new GDControllerShape(v, g, 0, 0);		break;	case Code::GD_ENTITY_SHAPE:		thing = new GDEntityShape(v, g, 0, 0);		break;	case Code::VIEW:		thing = new ShapeView(GetDiagramViewer()); 		break;	case Code::LINE:		thing = new Line(v, g, 0, 0, 0);		break;	// old line (arrow) types...	case Code::ARROW:		{			Line *line = new Line(v, g, 0, 0, 0);			line->SetEnd2(LineEnd::FILLED_ARROW);			thing = line;		}		break;	case Code::DOUBLE_ARROW:		{			Line *line = new Line(v, g, 0, 0, 0);			line->SetEnd1(LineEnd::FILLED_ARROW);			line->SetEnd2(LineEnd::FILLED_ARROW);			thing = line;		}		break;	case Code::DOUBLE_HEADED_ARROW:		{			Line *line = new Line(v, g, 0, 0, 0);			line->SetEnd2(LineEnd::DOUBLE_FILLED_ARROW);			thing = line;		}		break;	case Code::GENERIC_NODE:		thing = new GenericNode(GetGraph());		break;	case Code::EMPTY_NODE:		thing = new EmptyNode(GetGraph());		break;	case Code::COMMENT:		thing = new Comment(GetGraph());		break;	case Code::GENERIC_EDGE:		thing = new GenericEdge(GetGraph(), 0, 0);		break;	default:		error("%s, line %d: impl error: " "wrong class number %d\n", 			__FILE__, __LINE__, classNr);		return 0;	}	if (thing != 0 && HasIndexShape(thing->GetClassType()))		((NodeShape *)thing)->SetFixedIndexLabel(False);	return thing;}Node *GDDiagram::CreateNode(){	Node *node = 0;	switch ( GetNodeType() ) {	case Code::GENERIC_NODE:		node = new GenericNode(GetGraph());		break;	case Code::EMPTY_NODE:		node = new EmptyNode(GetGraph());		break;	case Code::COMMENT:		node = new Comment(GetGraph());		break;	default:		error("%s, line %d: impl error: "			"unknown node type\n", __FILE__, __LINE__);	}	return node;}Edge *GDDiagram::CreateEdge(Subject *node1, Subject *node2){	// Check possible connections (node-node-edge matrix).	if (!CheckConnection(node1, node2))		return 0; 	Edge *edge = 0;	if (GetEdgeType() == Code::GENERIC_EDGE)		edge = new GenericEdge(GetGraph(), node1, node2);	else 		error( "%s, line %d: impl error: "			" unknown edge type\n", __FILE__, __LINE__);	return edge;}NodeShape *GDDiagram::CreateNodeShape(Node *node, int x, int y) {	NodeShape *shape = 0;	Grafport *g = GetDiagramViewer()->GetGrafport();	ShapeView *v = GetDiagramViewer()->GetCurView();	int t = GetNodeShapeType();	switch ( t ) {	case Code::BOX:		shape = new Box(v, g, x, y);		break;	case Code::SQUARE:		shape = new Square(v, g, x, y);		break;	case Code::CIRCLE:		shape = new Circle(v, g, x, y);		break;	case Code::ELLIPSE:		shape = new Ellipse(v, g, x, y);		break;	case Code::STICKMAN:		shape = new StickMan(v, g, x, y);		break;	case Code::HEXAGON:		shape = new Hexagon(v, g, x, y);		break;	case Code::HORIZONTAL_BAR:		shape = new HorizontalBar(v, g, x, y);		break;	case Code::VERTICAL_BAR:		shape = new VerticalBar(v, g, x, y);		break;	case Code::TRIANGLE:		shape = new Triangle(v, g, x, y);		break;	case Code::ROUNDED_BOX:		shape = new RoundedBox(v, g, x, y);		break;	case Code::ELLIPSED_BOX:		shape = new EllipsedBox(v, g, x, y);		break;	case Code::DIAMOND:		shape = new Diamond(v, g, x, y);		break;	case Code::NOTE_BOX:		shape = new NoteBox(v, g, x, y);		break;	case Code::BLACK_DOT:		shape = new BlackDot(v, g, x, y);		break;	case Code::BULLS_EYE:		shape = new BullsEye(v, g, x, y);		break;	case Code::TEXT_BOX:		shape = new TextBox(v, g, x, y);		break;	case Code::SOLID_HORIZONTAL_BAR:                shape = new SolidHorizontalBar(v, g, x, y);		break;	case Code::SOLID_VERTICAL_BAR:                shape = new SolidVerticalBar(v, g, x, y);		break;	case Code::BUILDING_BLOCK:	 	shape = new BuildingBlock(v, g, x, y);		break;	case Code::CUBE:	 	shape = new Cube(v, g, x, y);		break;	case Code::FOLDER:	 	shape = new Folder(v, g, x, y);		break;	case Code::SUB_FOLDER:	 	shape = new SubFolder(v, g, x, y);		break;	case Code::DISK:	 	shape = new Disk(v, g, x, y);		break;	case Code::GD_BOUNDARY_SHAPE:		shape = new GDBoundaryShape(v, g, x, y);		break;	case Code::GD_CONTROLLER_SHAPE:		shape = new GDControllerShape(v, g, x, y);		break;	case Code::GD_ENTITY_SHAPE:		shape = new GDEntityShape(v, g, x, y);		break;	default:		error( "%s, line %d: impl error: "			"node shape type does not exist\n", __FILE__, __LINE__);	}	if (check(shape)) {		if (HasIndexShape(t))			shape->SetFixedIndexLabel(False);		shape->SetSubject(node);		shape->SetTextShape();	}	return shape;}Line *GDDiagram::CreateLine(		Edge *edge, GShape *from, GShape *to, List<Point *> *l) {	Grafport *g = GetDiagramViewer()->GetGrafport();	ShapeView *v = GetDiagramViewer()->GetCurView();	Line *line = 0;	int t = GetLineType();	if (t == Code::LINE)		line = new Line(v, g, from, to, l, IsCurve());	else		error( "%s, line %d: impl error: "			"line type does not exist\n", __FILE__, __LINE__);	if (check(line)) {		line->SetSubject(edge);		line->SetTextShape();		line->SetEnd1(GetLineEnd1());		line->SetEnd2(GetLineEnd2());	}	return line;}void GDDiagram::UpdateNodeType(int num) {	((DiagramWindow *)GetMainWindow())->SetNodeName(num);	switch (num) {	case 1: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::BOX);		break;	case 2: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::CIRCLE);		break;	case 3: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::ROUNDED_BOX);		break;	case 4: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::TRIANGLE);		break;	case 5: SetNodeType(Code::EMPTY_NODE);		SetNodeShapeType(Code::BULLS_EYE);		break;	case 6: SetNodeType(Code::GENERIC_NODE);	 	SetNodeShapeType(Code::STICKMAN);	 	break;	case 7: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::CUBE);		break;	case 8: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::GD_BOUNDARY_SHAPE);		break;	case 9: SetNodeType(Code::COMMENT);		SetNodeShapeType(Code::TEXT_BOX);		break;	case 10: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::DIAMOND);		break;	case 11: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::SQUARE);		break;	case 12: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::VERTICAL_BAR);		break;	case 13: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::HEXAGON);		break;	case 14: SetNodeType(Code::EMPTY_NODE);		SetNodeShapeType(Code::SOLID_VERTICAL_BAR);		break;	case 15: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::FOLDER);		break;	case 16: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::BUILDING_BLOCK);		break;	case 17: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::GD_CONTROLLER_SHAPE);		break;	case 18: SetNodeType(Code::GENERIC_NODE);	 	SetNodeShapeType(Code::NOTE_BOX);	 	break;	case 19: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::ELLIPSE);		break;	case 20: SetNodeType(Code::EMPTY_NODE);		SetNodeShapeType(Code::BLACK_DOT);		break;	case 21: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::HORIZONTAL_BAR);		break;	case 22: SetNodeType(Code::GENERIC_NODE);	 	SetNodeShapeType(Code::ELLIPSED_BOX);	 	break;	case 23: SetNodeType(Code::EMPTY_NODE);		SetNodeShapeType(Code::SOLID_HORIZONTAL_BAR);		break;	case 24: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::SUB_FOLDER);		break;	case 25: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::DISK);		break;	case 26: SetNodeType(Code::GENERIC_NODE);		SetNodeShapeType(Code::GD_ENTITY_SHAPE);		break;	default:		error("%s, line %d: impl error: "		"unknown node type selected\n", __FILE__,__LINE__);	}}void GDDiagram::UpdateEdgeType(int num) {	((DiagramWindow *)GetMainWindow())->SetEdgeName(num);	SetEdgeType(Code::GENERIC_EDGE);	SetLineType(Code::LINE);	switch(num) {	case 1: SetLineEnd1(LineEnd::EMPTY);		SetLineEnd2(LineEnd::EMPTY);		break;	case 2: SetLineEnd1(LineEnd::FILLED_ARROW);		SetLineEnd2(LineEnd::FILLED_ARROW);		break;	case 3: SetLineEnd1(LineEnd::EMPTY);		SetLineEnd2(LineEnd::FILLED_ARROW);		break;	case 4: SetLineEnd1(LineEnd::EMPTY);                SetLineEnd2(LineEnd::WHITE_TRIANGLE);		break;	case 5: SetLineEnd1(LineEnd::EMPTY);		SetLineEnd2(LineEnd::DOUBLE_FILLED_ARROW);		break;	case 6: SetLineEnd1(LineEnd::EMPTY);		SetLineEnd2(LineEnd::OPEN_ARROW);		break;	default:		error("%s, line %d: impl error: "			"unknown edge type selected\n", __FILE__,__LINE__);	}}bool GDDiagram::HasIndexNode(int code) {	return (code == Code::GENERIC_NODE);}bool GDDiagram::HasIndexShape(int code) {	switch ( code ) {	case Code::BOX:	case Code::SQUARE:	case Code::ELLIPSE:	case Code::CIRCLE:	case Code::ROUNDED_BOX:	case Code::DIAMOND:	case Code::TRIANGLE:	case Code::HORIZONTAL_BAR:	case Code::VERTICAL_BAR:	case Code::NOTE_BOX:	case Code::HEXAGON:	case Code::ELLIPSED_BOX:	case Code::FOLDER:	case Code::SUB_FOLDER:	case Code::CUBE:	case Code::BUILDING_BLOCK:	case Code::STICKMAN:	case Code::DISK:	case Code::GD_BOUNDARY_SHAPE:	case Code::GD_CONTROLLER_SHAPE:	case Code::GD_ENTITY_SHAPE:		return 1;	default:		return 0;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -