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

📄 cbinteraction.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 2001, University of Twente.// Author: Henk van de Zandschulp (henkz@cs.utwente.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 "lstring.h"#include "inputfile.h"#include "outputfile.h"#include "cbinteraction.h"#include "cbgraph.h"#include "cbdmessage.h"#include "gshape.h"#include "shapeview.h"#include "cbviewer.h"#include "diagramviewer.h"#include "subject.h"CBInteraction::CBInteraction(CBGraph *g, Subject *n1, Subject *n2): 		BinaryRelationship(g, n1, n2) {	messages = new List<CBDMessage *>;	//add an initial message	string *dummy_msg = new string("edit this >");	SetMessage(dummy_msg, 0 , False);}CBInteraction::~CBInteraction() {	messages->clear();	delete messages;}bool CBInteraction::SetConstraint(string *cons, const string *nm) {	// empty constraint is allowed	string t = *nm;	if (*nm == "" || True) {	//HZ_TMP 2B solved with bison...		*cons = *nm;		return True;	}	else		return False;}Subject::NameErrType CBInteraction::SetMessage(const CBDMessage *m, unsigned n, bool update) {	if (*m->GetString() != "" && m->GetString()->letters() == 0)		return Subject::IMPOSSIBLE_NAME;	// Check for double messages.	if (HasMessage(m)) {		if (n >= messages->count() || 			*(*messages)[n]->GetString() != *m->GetString() || !update)			return Subject::HAS_ACTION;	}	if (!update) 	// add new msg		messages->add((CBDMessage *)m);	else {	//update		CBDMessage *dummy = (*messages)[n];		dummy->SetString(m->GetString());	} // update	return Subject::OK;}Subject::NameErrType CBInteraction::SetMessage(string *s, unsigned n, bool update) {	string txt = *s;	CBDMessage::DirectionType msgDir = CBDMessage::TOSHAPE;	//init	if (*s != "") {		if (txt.endsWith(">") || txt.endsWith("v")) {			msgDir = CBDMessage::TOSHAPE;			txt.remove();		//last char		}		if (txt.endsWith("<") || txt.endsWith("^")) {			msgDir = CBDMessage::FROMSHAPE;			txt.remove();		//last char		}	}	if (*s != "" && s->letters() == 0)		return Subject::IMPOSSIBLE_NAME;	// Check for double messages.	if (!update) {		// add ??		if (*s != "") {	// add valid new msg			CBDMessage *msg = new CBDMessage(&txt,msgDir, CBDMessage::FLATFLOW);			messages->add(msg);		} 	} else {	//update		if (*s != "") {			CBDMessage *dummy = (*messages)[n];			if ((dummy->GetDirection() != msgDir) &&				(msgDir != CBDMessage::NONE)) {				dummy->SetDirection(msgDir);			}			dummy->SetString(&txt);		} else			messages->removei(n);	} // update	*s = txt;	// return stripped(?) string	return Subject::OK;}Subject::NameErrType CBInteraction::SetMessage(string *s, unsigned n, bool update, bool toggle) {	string txt = *s;	CBDMessage::DirectionType msgDir = CBDMessage::TOSHAPE;	//init	if (update && n>0) 	{	//existing msg : reset init			msgDir = (*messages)[n]->GetDirection();	}	//existing msg : reset init	if (*s != "") {		if (txt.endsWith(">") || txt.endsWith("v")) {			msgDir = CBDMessage::TOSHAPE;			txt.remove();		//last char		}		if (txt.endsWith("<") || txt.endsWith("^")) {			msgDir = CBDMessage::FROMSHAPE;			txt.remove();		//last char		}	}	if (*s != "") {		if (txt.endsWith(">") || txt.endsWith("v")) {			msgDir = (!toggle ? CBDMessage::TOSHAPE : CBDMessage::FROMSHAPE);			txt.remove();		//last char		}		if (txt.endsWith("<") || txt.endsWith("^")) {			msgDir = (!toggle ? CBDMessage::FROMSHAPE : CBDMessage::TOSHAPE);			txt.remove();		//last char		}	}	if (*s != "" && s->letters() == 0)		return Subject::IMPOSSIBLE_NAME;	// Check for double messages.	if (!update) {		// add ??		if (*s != "") {	// add valid new msg			CBDMessage *msg = new CBDMessage(&txt, msgDir, CBDMessage::FLATFLOW);			messages->add(msg);		} 	} else {	//update		if (*s != "") {			CBDMessage *dummy = (*messages)[n];			if ((dummy->GetDirection() != msgDir) &&				(msgDir != CBDMessage::NONE)) {				dummy->SetDirection(msgDir);			}			dummy->SetString(&txt);		} else			messages->removei(n);	} // update	*s = txt;	// return stripped(?) string	return Subject::OK;}const CBDMessage *CBInteraction::GetMessage(unsigned n) {	if (n < messages->count()) {		return (*messages)[n];	}	return 0;}bool CBInteraction::HasMessage(const CBDMessage *m) {	for (messages->first(); !messages->done(); messages->next()) {		CBDMessage *at = messages->cur();		if (*at->GetString() == *m->GetString())			return True;	}	return False;}void CBInteraction::WriteMembers(OutputFile *ofile) {	BinaryRelationship::WriteMembers(ofile);	unsigned num = messages->count();	string x;	(*ofile) << "\t{ Messages " << num << " }\n";	for (unsigned i=0; i<num; i++) {		(*ofile) << "\t{ Message " << '"' 			<< *(*messages)[i]->GetString() << '"' << " }\n";		CBDMessage::DirectionType2String((*messages)[i]->GetDirection(), &x);		(*ofile) << "\t{ Direction " << x << " }\n";		CBDMessage::ControlFlowType2String((*messages)[i]->GetFlow(), &x);		(*ofile) << "\t{ Flow " << x << " }\n";	}}bool CBInteraction::ReadMembers(InputFile *ifile, double format) {	if (!BinaryRelationship::ReadMembers(ifile, format))		return False;	string val;	if (!ifile->ReadAttribute("Messages", &val))		return False;	unsigned numItems = val.toint();	string *a = new string;	CBDMessage::DirectionType direction;	CBDMessage::ControlFlowType flow;	// Read messages data	for (int i=0; i<(int) numItems; i++) {		if (!ifile->ReadStringAttribute("Message", a)) {			delete a;			return False;		}		if (!ifile->ReadAttribute("Direction", &val))			return False;		direction = CBDMessage::String2DirectionType(&val);		if (!ifile->ReadAttribute("Flow", &val))			return False;		flow = CBDMessage::String2ControlFlowType(&val);		if (i == 0) 		//overrule dummy "edit this" message			messages->clear();		messages->add(new CBDMessage(a, direction, flow));	}	return True;}

⌨️ 快捷键说明

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