#include #include "xcddraw.h" #include "obj-store.h" int judge_offset = 5; NameSensitiveVertex:: NameSensitiveVertex() { vertex_name = new ClassNameObject(); primary = NULL; vertices = new ObjectStore(); tempinststore = new TemplateInstStore(); comments = new Comments(); before = after = NULL; outgoing_consedge_store = new ObjectStore(); outgoing_paredge_store = new ObjectStore(); } NameSensitiveVertex::~ NameSensitiveVertex() { delete vertex_name; /*TO DO: free all the vertices */ delete vertices; delete tempinststore; if (before) free(before); if (after) free(after); delete comments; if (outgoing_consedge_store) delete outgoing_consedge_store; if (outgoing_paredge_store) delete outgoing_paredge_store; } void ObjectStore::append(GraphicsObject *gobj) { if (this->get_max_x() < gobj->get_max_x()) this->set_max_x(gobj->get_max_x()); if (this->get_max_y() < gobj->get_max_y()) this->set_max_y(gobj->get_max_y()); if (this->get_min_x() > gobj->get_min_x()) this->set_min_x(gobj->get_min_x()); if (this->get_min_y() > gobj->get_min_y()) this->set_min_y(gobj->get_min_y()); if (objects == NULL) { objects = new GraphicsObjectList(); objects->set_elm(gobj); } else objects->append(gobj); } void ObjectStore::draw() { if (objects) objects->draw(); } void GraphicsObjectList::append(GraphicsObject *gobj) { if (this->get_next()) this->get_next()->append(gobj); else { this->set_next(new GraphicsObjectList()); this->get_next()->set_elm(gobj); this->get_next()->set_prev(this); } } void GraphicsObjectList::draw() { this->get_elm()->draw(); if (this->get_next()) this->get_next()->draw(); } /*-------------------*/ void Rectangle::xor_draw() { XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1()); XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1() - 20); } void Circle::xor_draw() { /* 60 * ------------- *20 |-----------| * | | *40 | | * ------------- */ XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1()); XDrawArc(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 10, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1() - 20, this->get_y2() - this->get_y1() - 20, 0,64 * 360); } void TRectangle::xor_draw() { XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1()); XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1() - 20); } void ERectangle::xor_draw() { XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1()); XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1() - 20); } void Hexagon::xor_draw() { XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1()); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); } void HexagonRect::xor_draw() { XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1()); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60); } void ClassNameObject::xor_draw() { } void VertexObject::xor_draw() { this->get_name()->xor_draw(); this->get_box()->xor_draw(); } void VertexObject::set_xy(int x,int y) { this->get_box()->set_x1(x); this->get_box()->set_y1(y); this->get_box()->set_x2(x + box_width); this->get_box()->set_y2(y + box_height); } void VertexObject::get_xy(int &x,int &y) { x = this->get_box()->get_x1(); x = this->get_box()->get_y1(); } /* real draw */ void Rectangle::draw(primary_flag_t pflag, GC cur_gc,GC fgc) { /* 60 * ------------- *20 |-----------| * | | *40 | | * ------------- */ XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1(), this->get_y2() - (this->get_y1() + 20)); if (pflag == PRIMARY_OF) { static XTextItem xtext; xtext.chars = "*"; xtext.nchars = 1; xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 35, &xtext, 1); } } void Circle::draw(primary_flag_t pflag, GC cur_gc, GC fgc) { /* 60 * ------------- *20 |-----------| * | | *40 | | * ------------- */ XDrawArc(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 10, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1() - 20, this->get_y2() - this->get_y1() - 20, 0, 64 * 360); if (pflag == PRIMARY_OF) { static XTextItem xtext; xtext.chars = "*"; xtext.nchars = 1; xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 35, &xtext, 1); } } void TRectangle::draw(primary_flag_t pflag, GC cur_gc, GC fgc) { /* 60 * ------------- *20 |-----------| * | | *40 | | * ------------- */ static XTextItem xtext; static char *t = "T"; xtext.chars = t; xtext.nchars = 1; xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 45, &xtext, 1); XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1() - 20); if (pflag == PRIMARY_OF) { xtext.chars = "*"; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 35, &xtext, 1); } } void ERectangle::draw(primary_flag_t pflag, GC cur_gc, GC fgc) { /* 60 * ------------- *20 |-----------| * | | *40 | | * ------------- */ static XTextItem xtext; static char *t = "?"; xtext.chars = t; xtext.nchars = 1; xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 45, &xtext, 1); XDrawRectangle(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 20, this->get_x2() - this->get_x1(), this->get_y2() - this->get_y1() - 20); if (pflag == PRIMARY_OF) { xtext.chars = "*"; xtext.nchars = 1; xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 35, &xtext, 1); } } void Hexagon::draw(primary_flag_t pflag, GC cur_gc, GC fgc) { /* 60 * ------------- *20 |-----------| * / \ *40 \ / * ------------- * | 30 | */ XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); if (pflag == PRIMARY_OF) { static XTextItem xtext; xtext.chars = "*"; xtext.nchars = 1; xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 35, &xtext, 1); } } void HexagonRect::draw(primary_flag_t pflag, GC cur_gc, GC fgc) { /* 60 * ------------- *20 |-----------| * / \ *40 \ / * ------------- * | 30 | */ XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset, this->get_y1() - pix_voffset + 40, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60, this->get_x1() - pix_hoffset + 60, this->get_y1() - pix_voffset + 40); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 15, this->get_y1() - pix_voffset + 60); XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), cur_gc, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 20, this->get_x1() - pix_hoffset + 45, this->get_y1() - pix_voffset + 60); if (pflag == PRIMARY_OF) { static XTextItem xtext; xtext.chars = "*"; xtext.nchars = 1; xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),fgc, this->get_x1() - pix_hoffset + 25, this->get_y1() - pix_voffset + 35, &xtext, 1); } } void ClassNameObject::draw(int name_x, int name_y) { static XTextItem xtext; if (this->get_val()) { xtext.chars = this->get_val(); xtext.nchars = strlen(this->get_val()); xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),class_gc, name_x - pix_hoffset , name_y - pix_voffset, &xtext, 1); } else ; /* fprintf(stderr,"Unlabelled vertex?\n"); for unbouded vertices */ } void ParameterAssignmentStore::concat_name(char *pname) { if (assignments) assignments->concat_name(pname); } void ParameterAssignment::concat_name(char *pname) { if (actual_val == NULL || strlen(actual_val) == 0) formaledge->get_to_vertex()->concat_name(pname); else strcat(pname,actual_val); } void ParameterAssignmentList::concat_name(char *pname) { this->get_elm()->concat_name(pname); if (next) { strcat(pname,","); next->concat_name(pname); } } void VertexObject::concat_name(char *pname) { /* it must be a parameter */ this->get_name()->concat_name(pname); } void TextObject::concat_name(char *pname) { strcat(pname,val); } void ClassNameObject::get_parameterized_name(ParameterAssignmentStore *parassignstore, char *pname) { /* assert(this->get_val()); not true for unbouded vertices */ if (this->get_val()) strcat(pname,this->get_val()); strcat(pname,"("); parassignstore->concat_name(pname); strcat(pname,")"); } void ClassNameObject::undraw(int name_x, int name_y) { static XTextItem xtext; if (this->get_val()) { xtext.chars = this->get_val(); xtext.nchars = strlen(this->get_val()); xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area), reversed_class_gc, name_x - pix_hoffset , name_y - pix_voffset, &xtext, 1); } else ; /*fprintf(stderr,"Unlabelled vertex?\n"); for unbouded vertices*/ } void VertexObject::draw() { GC v_gc; if (this->no_formal_parameters()) { switch (this->get_primary_flag()) { case PRIMARY: case PRIMARY_OF: if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_p_v_gc; else v_gc = p_v_gc; break; case NONPRIMARY: if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_up_v_gc; else v_gc = up_v_gc; break; case UNCLASSICFIED: if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_p_v_gc; else v_gc = p_v_gc; break; case UNKNOWN: printf("Unknow primary kind UNKNOWN\n"); if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_p_v_gc; else v_gc = p_v_gc; break; default: printf("Unknow primary kind\n"); if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_p_v_gc; else v_gc = p_v_gc; break; } } else { switch (this->get_primary_flag()) { case PRIMARY: case PRIMARY_OF: if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_par_p_v_gc; else v_gc = par_p_v_gc; break; case NONPRIMARY: if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_par_up_v_gc; else v_gc = par_up_v_gc; break; case UNCLASSICFIED: if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_par_p_v_gc; else v_gc = par_p_v_gc; break; case UNKNOWN: printf("Unknow primary kind UNKNOWN\n"); if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_par_p_v_gc; else v_gc = par_p_v_gc; break; default: printf("Unknow primary kind\n"); if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) v_gc = xor_par_p_v_gc; else v_gc = par_p_v_gc; break; } } if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) this->get_box()->draw(this->get_primary_flag(),v_gc,xor_class_gc); else this->get_box()->draw(this->get_primary_flag(),v_gc,class_gc); XTextItem xtext; char pname[1024]; pname[0] = '\0'; if (this->get_is_template()) { this->get_name()->get_parameterized_name(parassignstore,pname); if (this->no_parameters()) pname[strlen(pname)-2] = '\0'; } else if (this->get_template_name()) /* template instance */ this->get_template_name()->get_parameterized_name(parassignstore,pname); xtext.chars = pname; xtext.nchars = strlen(pname); xtext.delta = 0; xtext.font = class_font->fid; if ((this->get_selected_flag() == SELECT_VERTEX || this->get_selected_flag() == SELECT_VERTEX_NAME) && moving_flag) XDrawText(XtDisplay(draw_area), XtWindow(draw_area),xor_class_gc, name_x - pix_hoffset , name_y - pix_voffset, &xtext, 1); else XDrawText(XtDisplay(draw_area), XtWindow(draw_area),class_gc, name_x - pix_hoffset , name_y - pix_voffset, &xtext, 1); } /* void VertexObject::redraw() { this->get_name()->undraw(this->get_name_x(),this->get_name_y()); GC v_gc; switch (this->get_primary_flag()) { case PRIMARY: case PRIMARY_OF: v_gc = reversed_p_v_gc; break; case NONPRIMARY: v_gc = reversed_p_v_gc; break; case UNCLASSICFIED: v_gc = reversed_p_v_gc; break; case UNKNOWN: printf("Unknow primary kind UNKNOWN\n"); v_gc = reversed_p_v_gc; break; default: printf("Unknow primary kind\n"); v_gc = reversed_p_v_gc; break; } if (this->get_selected_flag() == SELECT_VERTEX && moving_flag) this->get_box()->draw(this->get_primary_flag(),v_gc,xor_class_gc); else this->get_box()->draw(this->get_primary_flag(),v_gc,class_gc); this->draw(); } */ void VertexObject::duplicate_parassign(ParameterAssignmentStore *astore,int f) { assert(this->get_parassignstore()->empty()); astore->duplicate_parassign(this->get_parassignstore(),f); } void ParameterAssignmentStore::duplicate_parassign( ParameterAssignmentStore *astore,int f ) { if (assignments) assignments->duplicate_parassign(astore,f); } void ParameterAssignmentList::duplicate_parassign( ParameterAssignmentStore *astore,int f ) { ParameterAssignment *nassign = new ParameterAssignment(); nassign->set_formaledge(this->get_elm()->get_formaledge()); nassign->set_actual_val(this->get_elm()->get_actual_val()); if (f) { if (nassign->get_actual_val()) nassign->set_flag(READONLY); else nassign->set_flag(READWRITE); } else nassign->set_flag(this->get_elm()->get_flag()); astore->append_parassign(nassign); if (next) next->duplicate_parassign(astore,f); } void ClassNameObject::set_name( char *n, int bx, int by) { this->set_val(n); this->set_x(bx); this->set_y(by); this->set_text_width(XTextWidth(class_font,this->get_val(), strlen(this->get_val()))); } /*----------------------*/ void ObjectStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { if (objects) objects->select_box(rx,ry,mx,my,end_v); } void GraphicsObjectList::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { this->get_elm()->select_box(rx,ry,mx,my,end_v); if (end_v == NULL && this->get_next()) this->get_next()->select_box(rx,ry,mx,my,end_v); } void VertexObject::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { box->select_box(rx,ry,mx,my,end_v,this); } void set_rect_border_point( int x1, int y1, int x2, int y2, int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { int center_x = (x2 + x1)/2 ; int center_y = (y2 + y1)/2 ; if ((abs( mx - center_x) <= 30 + judge_offset) && (abs(my - center_y) <= 20 + judge_offset)) { if (mx <= x1) { rx = x1; ry = (my <= y1)? y1 : ((my >= y2)? y2 : my); } else if (mx >= x2) { rx = x2; ry = (my <= y1)? y1 : ((my >= y2)? y2 : my); } else if (my <= y1) { rx = (mx <= x1)? x1 : ((mx >= x2)? x2 : mx); ry = y1; } else if (my >= y2) { rx = (mx <= x1)? x1 : ((mx >= x2)? x2 : mx); ry = y2; } else if ((mx < center_x) && (abs((y1-center_y)/(x1-center_x)) >= abs((my-center_y)/(mx-center_x)))) { rx = x1; ry = (my <= y1)? y1 : ((my >= y2)? y2 : my); } else if ((mx > center_x) && (abs((y1-center_y)/(x1-center_x)) >= abs((my-center_y)/(mx-center_x)))) { rx = x2; ry = (my <= y1)? y1 : ((my >= y2)? y2 : my); } else if (my < center_y) { rx = (mx <= x1)? x1 : ((mx >= x2)? x2 : mx); ry = y1; } else { rx = (mx <= x1)? x1 : ((mx >= x2)? x2 : mx); ry = y2; } end_v = cur_v; } } void Rectangle::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { set_rect_border_point(this->get_x1(), this->get_y1()+20,this->get_x2(),this->get_y2(), rx,ry,mx,my,end_v,cur_v); } void Circle::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { set_rect_border_point(this->get_x1(), this->get_y1()+20,this->get_x2(),this->get_y2(), rx,ry,mx,my,end_v,cur_v); if (end_v) { double a,b,c; a = (this->get_x1() + this->get_x2())/2; b = (this->get_y1()+20 + this->get_y2())/2; c = sqrt((mx - a) * (mx - a) + (my -b) * (my - b)); rx = (int) (20 * (mx - a) / c + a); ry = (int) (20 * (my - b) / c + b); } } void TRectangle::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { set_rect_border_point(this->get_x1(), this->get_y1()+20,this->get_x2(),this->get_y2(), rx,ry,mx,my,end_v,cur_v); } void ERectangle::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { set_rect_border_point(this->get_x1(), this->get_y1()+20,this->get_x2(),this->get_y2(), rx,ry,mx,my,end_v,cur_v); } void line_intersect( int x11, int y11, int x12, int y12, int x21, int y21, int x22, int y22, int &rx, int &ry) { rx = ((y11 - y21)*(x11 - x12)*(x21 - x22) - x11*(y11 - y12)*(x21 - x22) + x21*(y21 - y22)*(x11 - x12))/ ((y21 - y22)*(x11 - x12) - (y11 - y12)*(x21 - x22)); ry = ((rx - x21)*(y21 - y22))/(x21 - x22) + y21; } void set_hex_border_point( int x1, int y1, int x2, int y2, int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { set_rect_border_point(x1,y1,x2,y2, rx,ry,mx,my,end_v,cur_v); if (end_v) { if (abs(rx - (x1 + 30)) > 15) { /* not on the horizontal lines. reset coordinates. */ if ((rx - x1 < 15) && (ry - y1 < 20)) { /* upper left */ int tx,ty; line_intersect(x1+15,y1,x1,y1+20,rx,ry,(x1+x2)/2,(y1+y2)/2,tx,ty); rx = tx; ry = ty; } else if ((rx - x1 < 15) && (ry - y1 > 20)) { /* lower left */ int tx,ty; line_intersect(x1,y1+20,x1+15,y2,rx,ry,(x1+x2)/2,(y1+y2)/2,tx,ty); rx = tx; ry = ty; } else if ((rx - x1 > 45) && (ry - y1 < 20)) { /* upper right */ int tx,ty; line_intersect(x1+45,y1,x2,y1+20,(x1+x2)/2,(y1+y2)/2,rx,ry,tx,ty); rx = tx; ry = ty; } else if ((rx - x1 > 45) && (ry - y1 > 20)) { /* lower right */ int tx,ty; line_intersect(x1+45,y2,x2,y1+20,(x1+x2)/2,(y1+y2)/2,rx,ry,tx,ty); rx = tx; ry = ty; } } } } void Hexagon::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { set_hex_border_point(this->get_x1(), this->get_y1()+20,this->get_x2(),this->get_y2(), rx,ry,mx,my,end_v,cur_v); } void HexagonRect::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v, VertexObject *cur_v) { set_hex_border_point(this->get_x1(), this->get_y1()+20,this->get_x2(),this->get_y2(), rx,ry,mx,my,end_v,cur_v); } /******************************/ void EdgeObject::append(PointObject *npt) { if (points) points->append(npt); else { points = new PointObjectList(); points->set_elm(npt); } } void PointObjectList::append(PointObject *npt) { if (this->get_next()) this->get_next()->append(npt); else { this->set_next(new PointObjectList()); this->get_next()->set_elm(npt); this->get_next()->set_prev(this); } } void PointObjectList::set_xy(int x,int y) { if (this->get_next()) this->get_next()->set_xy(x,y); else { this->get_elm()->set_x(x); this->get_elm()->set_y(y); } } void PointObjectList::xor_draw() { if (this->get_next()) { XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_elm()->get_x() - pix_hoffset, this->get_elm()->get_y() - pix_voffset, this->get_next()->get_elm()->get_x() - pix_hoffset, this->get_next()->get_elm()->get_y() - pix_voffset); this->get_next()->xor_draw(); } } void PointObjectList::xor_draw_last_segment() { if (this->get_next()) { if (this->get_next()->get_next() == NULL) { XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), xorgc, this->get_elm()->get_x() - pix_hoffset, this->get_elm()->get_y() - pix_voffset, this->get_next()->get_elm()->get_x() - pix_hoffset, this->get_next()->get_elm()->get_y() - pix_voffset); } else this->get_next()->xor_draw_last_segment(); } } void draw_line(draw_kind kind,XPoint *pts,int l, int doxor) { switch(kind) { case ALT_EDGE: if (doxor) { XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_ae_bgc,pts,l,CoordModeOrigin); XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_ae_fgc,pts,l,CoordModeOrigin); } else { XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),ae_bgc,pts,l,CoordModeOrigin); XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),ae_fgc,pts,l,CoordModeOrigin); } break; case REQ_C_EDGE: if (doxor) XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_re_gc,pts,l,CoordModeOrigin); else XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),re_gc,pts,l,CoordModeOrigin); break; case OPT_C_EDGE: if (doxor) XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_re_gc,pts,l,CoordModeOrigin); else XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),oe_gc,pts,l,CoordModeOrigin); break; case REQ_R_EDGE: if (doxor) XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_re_gc,pts,l,CoordModeOrigin); else XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),re_gc,pts,l,CoordModeOrigin); break; case OPT_R_EDGE: if (doxor) XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_re_gc,pts,l,CoordModeOrigin); else XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),oe_gc,pts,l,CoordModeOrigin); break; case INH_EDGE: if (doxor) { XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_ae_bgc,pts,l,CoordModeOrigin); XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_ae_fgc,pts,l,CoordModeOrigin); } else { XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),ie_bgc,pts,l,CoordModeOrigin); XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),ie_fgc,pts,l,CoordModeOrigin); } break; case PAR_EDGE: if (doxor) XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_pe_gc,pts,l,CoordModeOrigin); else XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),pe_gc,pts,l,CoordModeOrigin); break; case PAR_INST_EDGE: if (doxor) XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),xor_pie_gc,pts,l,CoordModeOrigin); else XDrawLines(XtDisplay(draw_area),XtWindow(draw_area),pie_gc,pts,l,CoordModeOrigin); break; default: fprintf(stderr,"Unknown edge kind: %d\n",kind); exit(1); } } void EdgeObject::draw() { int l = this->get_points()->length(); XPoint *pts = new XPoint[l]; this->get_points()->draw(this->get_selected_flag(),this->get_kind(),pts,0,l, this->get_from_vertex(),this->get_to_vertex()); delete pts; } void ConstructionEdge::draw() { if ((this->get_selected_flag() == SELECT_EDGE_LABEL || this->get_from_vertex()->get_selected_flag() == SELECT_VERTEX || this->get_to_vertex()->get_selected_flag() == SELECT_VERTEX || this->get_selected_flag() == SELECT_EDGE_START_POINT || this->get_selected_flag() == SELECT_EDGE_END_POINT || this->get_selected_flag() == SELECT_EDGE_INNER_POINT) && moving_flag) this->get_edge_label()->draw(xor_label_gc); else this->get_edge_label()->draw(label_gc); int l = this->get_points()->length(); XPoint *pts = new XPoint[l]; this->get_points()->draw(this->get_selected_flag(),this->get_kind(),pts,0,l, this->get_from_vertex(),this->get_to_vertex()); delete pts; } static double theta = 3.14159265358979323846/7; static double sin_theta = sin(theta); static double cos_theta = cos(theta); void PointObjectList::draw(selectflag_t sf,draw_kind kind,XPoint *pts,int i,int l, VertexObject *fv,VertexObject *tv) { int x1,y1,x2,y2; pts[i].x = this->get_elm()->get_x() - pix_hoffset; pts[i].y = this->get_elm()->get_y() - pix_voffset; if (this->get_next()) { this->get_next()->draw(sf,kind,pts,i+1,l,fv,tv); return; } if ( moving_flag && (sf == SELECT_EDGE_END_POINT || sf == SELECT_EDGE_START_POINT || sf == SELECT_EDGE_INNER_POINT || fv->get_selected_flag() == SELECT_VERTEX || tv->get_selected_flag() == SELECT_VERTEX)) draw_line(kind,pts,l,1); else draw_line(kind,pts,l,0); x1 = this->get_prev()->get_elm()->get_x() - pix_hoffset; y1 = this->get_prev()->get_elm()->get_y() - pix_voffset; x2 = this->get_elm()->get_x() - pix_hoffset; y2 = this->get_elm()->get_y() - pix_voffset; /* draw arrow */ double arrow_slope_length; if (kind == INH_EDGE || kind == ALT_EDGE || kind == PAR_INST_EDGE) arrow_slope_length = 20; else if (kind == PAR_EDGE) arrow_slope_length = 10; else arrow_slope_length = 15; if (y1 == y2) { int xd1,yd1,xd2,yd2,xd3,yd3,xd4,yd4; XPoint points[4]; xd1 = x2; yd1 = y2; yd2 = yd1 + (int) (arrow_slope_length * sin_theta); yd3 = yd1; yd4 = yd1 - (int) (arrow_slope_length * sin_theta); if (x1 > x2) { xd2 = xd4 = x2 + (int) (arrow_slope_length * cos_theta); xd3 = x2 + (int)(arrow_slope_length/2); } else { xd2 = xd4 = x2 - (int) (arrow_slope_length * cos_theta); xd3 = x2 - (int)(arrow_slope_length/2); } points[0].x = xd1; points[0].y = yd1; points[1].x = xd2; points[1].y = yd2; points[2].x = xd3; points[2].y = yd3; points[3].x = xd4; points[3].y = yd4; if ( moving_flag && (sf == SELECT_EDGE_END_POINT || sf == SELECT_EDGE_START_POINT || sf == SELECT_EDGE_INNER_POINT || fv->get_selected_flag() == SELECT_VERTEX || tv->get_selected_flag() == SELECT_VERTEX)) XFillPolygon(XtDisplay(draw_area),XtWindow(draw_area),xor_p_v_gc, points,4,Nonconvex, CoordModeOrigin); else XFillPolygon(XtDisplay(draw_area),XtWindow(draw_area),p_v_gc, points,4,Nonconvex, CoordModeOrigin); return; } else if (x1 == x2) { int xd1,yd1,xd2,yd2,xd3,yd3,xd4,yd4; XPoint points[4]; xd1 = x2; yd1 = y2; xd2 = xd1 + (int) (arrow_slope_length * sin_theta); xd3 = xd1; xd4 = xd1 - (int) (arrow_slope_length * sin_theta); if (y1 > y2) { yd2 = yd4 = y2 + (int) (arrow_slope_length * cos_theta); yd3 = y2 + (int)(arrow_slope_length/2); } else { yd2 = yd4 = y2 - (int) (arrow_slope_length * cos_theta); yd3 = y2 - (int)(arrow_slope_length/2); } points[0].x = xd1; points[0].y = yd1; points[1].x = xd2; points[1].y = yd2; points[2].x = xd3; points[2].y = yd3; points[3].x = xd4; points[3].y = yd4; if ( moving_flag && (sf == SELECT_EDGE_END_POINT || sf == SELECT_EDGE_START_POINT || sf == SELECT_EDGE_INNER_POINT || fv->get_selected_flag() == SELECT_VERTEX || tv->get_selected_flag() == SELECT_VERTEX)) XFillPolygon(XtDisplay(draw_area),XtWindow(draw_area),xor_p_v_gc, points,4,Nonconvex, CoordModeOrigin); else XFillPolygon(XtDisplay(draw_area),XtWindow(draw_area),p_v_gc, points,4,Nonconvex, CoordModeOrigin); return; } else { double xd1,yd1; XPoint points[4]; xd1 = x2; yd1 = y2; double d = sqrt(((double)x1-(double)x2) * ((double)x1-(double)x2) + ((double)y1-(double)y2) * ((double)y1-(double)y2)); double xd2 = cos_theta; double yd2 = sin_theta; double xd3 = 0.6; double yd3 = 0; double xd4 = xd2; double yd4 = -yd2; /* rotate */ double sin_gamma = ((double)y1-(double)y2)/d; double cos_gamma = ((double)x1-(double)x2)/d; double tx = xd2*cos_gamma - yd2*sin_gamma; double ty = xd2*sin_gamma + yd2*cos_gamma; xd2 = tx; yd2 = ty; tx = xd3*cos_gamma - yd3*sin_gamma; ty = xd3*sin_gamma + yd3*cos_gamma; xd3 = tx; yd3 = ty; tx = xd4*cos_gamma - yd4*sin_gamma; ty = xd4*sin_gamma + yd4*cos_gamma; xd4 = tx; yd4 = ty; d = sqrt(tx*tx + ty*ty); xd2 = xd2/d*arrow_slope_length + x2; xd3 = xd3/d*arrow_slope_length + x2; xd4 = xd4/d*arrow_slope_length + x2; yd2 = yd2/d*arrow_slope_length + y2; yd3 = yd3/d*arrow_slope_length + y2; yd4 = yd4/d*arrow_slope_length + y2; points[0].x = (int)xd1; points[0].y = (int)yd1; points[1].x = (int)xd2; points[1].y = (int)yd2; points[2].x = (int)xd3; points[2].y = (int)yd3; points[3].x = (int)xd4; points[3].y = (int)yd4; if ( moving_flag && (sf == SELECT_EDGE_END_POINT || sf == SELECT_EDGE_START_POINT || sf == SELECT_EDGE_INNER_POINT || fv->get_selected_flag() == SELECT_VERTEX || tv->get_selected_flag() == SELECT_VERTEX)) XFillPolygon(XtDisplay(draw_area),XtWindow(draw_area),xor_p_v_gc, points,4,Nonconvex, CoordModeOrigin); else XFillPolygon(XtDisplay(draw_area),XtWindow(draw_area),p_v_gc, points,4,Nonconvex, CoordModeOrigin); return; } } void ConstructionEdge::initial_set_label(char *name) { PointObject *first = this->get_points()->get_elm(); PointObject *second = this->get_points()->get_next()->get_elm(); EdgeLabelObject *new_text = new EdgeLabelObject(); this->set_edge_label(new_text); new_text->set_val(name); if (abs(first->get_y() - second->get_y()) < 7) { new_text->set_x((first->get_x() + second->get_x())/2); new_text->set_y((first->get_y() + second->get_y())/2+14); } else if (abs(first->get_x() - second->get_x()) < 7) { new_text->set_x((first->get_x() + second->get_x())/2+7); new_text->set_y((first->get_y() + second->get_y())/2); } else if (first->get_x() < second->get_x()) { if (first->get_y() < second->get_y()) { new_text->set_x((first->get_x() + second->get_x())/2-14); new_text->set_y((first->get_y() + second->get_y())/2+14); } else { new_text->set_x((first->get_x() + second->get_x())/2+14); new_text->set_y((first->get_y() + second->get_y())/2+14); } } else { if (first->get_y() < second->get_y()) { new_text->set_x((first->get_x() + second->get_x())/2-14); new_text->set_y((first->get_y() + second->get_y())/2-14); } else { new_text->set_x((first->get_x() + second->get_x())/2+14); new_text->set_y((first->get_y() + second->get_y())/2-14); } } /* set width ... here */ } void EdgeLabelObject::xor_draw() { } void EdgeLabelObject::draw(GC cur_gc) { static XTextItem xtext; if (this->get_val()) { xtext.chars = this->get_val(); xtext.nchars = strlen(this->get_val()); xtext.delta = 0; xtext.font = label_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area),cur_gc, this->get_x() - pix_hoffset , this->get_y() - pix_voffset, &xtext, 1); return; } fprintf(stderr,"Unlabel construction edge?\n"); } void EdgeLabelObject::undraw() { static XTextItem xtext; if (this->get_val()) { xtext.chars = this->get_val(); xtext.nchars = strlen(this->get_val()); xtext.delta = 0; xtext.font = class_font->fid; XDrawText(XtDisplay(draw_area), XtWindow(draw_area), reversed_label_gc, this->get_x() - pix_hoffset , this->get_y() - pix_voffset, &xtext, 1); return; } fprintf(stderr,"Unlabel construction edge?\n"); } void EdgeLabelObject::set_name( char *n, int bx, int by) { this->set_val(n); this->set_x(bx); this->set_y(by); this->set_text_width(XTextWidth(label_font,this->get_val(), strlen(this->get_val()))); } void ParameterAssignmentStore::append_parassign(ParameterEdge *npe) { if (!assignments) { assignments = new ParameterAssignmentList(); assignments->set_elm(new ParameterAssignment()); assignments->get_elm()->set_formaledge(npe); } else assignments->append_parassign(npe); } void ParameterAssignmentList::append_parassign(ParameterEdge *npe) { if (!next) { next = new ParameterAssignmentList(); ParameterAssignment *newassign = new ParameterAssignment(); next->set_elm(newassign); next->get_elm()->set_formaledge(npe); next->set_prev(this); } else next->append_parassign(npe); } void ObjectStore::add_parassign_to_inst(ParameterEdge *npe) { if (objects) objects->add_parassign_to_inst(npe); } void GraphicsObjectList::add_parassign_to_inst(ParameterEdge *npe) { this->get_elm()->add_parassign_to_inst(npe); if (next) next->add_parassign_to_inst(npe); } void ParameterInstEdge::add_parassign_to_inst(ParameterEdge *npe) { this->get_from_vertex()->add_parassign_to_inst(npe); } void VertexObject::add_parassign_to_inst(ParameterEdge *npe) { parassignstore->add_parassign_to_inst(npe); this->get_incoming_parinstedge_store()->add_parassign_to_inst(npe); } void ParameterAssignmentStore::add_parassign_to_inst(ParameterEdge *npe) { if (!assignments) { assignments = new ParameterAssignmentList(); ParameterAssignment *newassign = new ParameterAssignment(); assignments->set_elm(newassign); assignments->get_elm()->set_formaledge(npe); newassign->set_flag(READWRITE); } else assignments->add_parassign_to_inst(npe); } void ParameterAssignmentList::add_parassign_to_inst(ParameterEdge *npe) { if (!next) { next = new ParameterAssignmentList(); ParameterAssignment *newassign = new ParameterAssignment(); next->set_elm(newassign); next->set_prev(this); next->get_elm()->set_formaledge(npe); newassign->set_flag(READWRITE); } else next->add_parassign_to_inst(npe); } void ParameterAssignmentList::append_parassign(ParameterAssignment *npassign) { if (this->get_next() == NULL) { this->set_next(new ParameterAssignmentList()); this->get_next()->set_elm(npassign); this->get_next()->set_prev(this); } else this->get_next()->append_parassign(npassign); } void ParameterAssignmentStore::append_parassign(ParameterAssignment *npassign) { if (assignments == NULL) { assignments = new ParameterAssignmentList(); assignments->set_elm(npassign); } else assignments->append_parassign(npassign); } int ParameterAssignmentStore::no_formal_parameters() { if (!assignments) return 1; else return assignments->no_formal_parameters(); } int ParameterAssignmentStore::no_parameters() { return assignments == NULL; } int ParameterAssignmentList::no_formal_parameters() { if (!elm->no_formal_parameters()) return 0; /* there is one! */ else if (next) return next->no_formal_parameters(); else return 1; } int ParameterAssignment::no_formal_parameters() { return actual_val != NULL; } void ObjectStore::append_edge(EdgeObject *ne) { this->append(ne); /* add it to the edge list */ switch(ne->get_kind()) { case ALT_EDGE: ne->get_to_vertex()->get_incoming_altedge_store()->append(ne); ne->get_from_vertex()->get_outgoing_altedge_store()->append(ne); break; case REQ_C_EDGE: case OPT_C_EDGE: ne->get_to_vertex()->get_incoming_consedge_store()->append(ne); ne->get_from_vertex()->get_outgoing_consedge_store()->append(ne); break; case REQ_R_EDGE: case OPT_R_EDGE: ne->get_to_vertex()->get_incoming_repedge_store()->append(ne); ne->get_from_vertex()->get_outgoing_repedge_store()->append(ne); break; case INH_EDGE: ne->get_to_vertex()->get_incoming_inhedge_store()->append(ne); ne->get_from_vertex()->get_outgoing_inhedge_store()->append(ne); break; case PAR_EDGE: ne->get_to_vertex()->get_incoming_paredge_store()->append(ne); ne->get_from_vertex()->get_outgoing_paredge_store()->append(ne); redraw(); break; case PAR_INST_EDGE: ne->get_to_vertex()->get_incoming_parinstedge_store()->append(ne); ne->get_from_vertex()->get_outgoing_parinstedge_store()->append(ne); break; default: break; } } void GraphicsObject::draw_select() { this->drawSelected(this->get_selected_flag()); } /*********** D R A W ( ) ****************/ void VertexStore::draw() { consvstore->draw(); altvstore->draw(); repvstore->draw(); termvstore->draw(); paravstore->draw(); extvstore->draw(); ubvstore->draw(); } void TemplateInstStore::draw() { instances->draw(); } void NameInsensitiveVertexStore::draw() { vertices->draw(); } void NameSensitiveVertexStore::draw() { if (vertices) vertices->draw(); } void NameSensitiveVertexList::draw() { elm->draw(); if (next) next->draw(); } void NameSensitiveVertex::draw() { vertices->draw(); tempinststore->draw(); } void ConstructionVertexStore::draw() { tempstore->draw(); } void AlternationVertexStore::draw() { tempstore->draw(); } void RepetitionVertexStore::draw() { tempstore->draw(); } void TerminalVertexStore::draw() { vstore->draw(); } void UnboundVertexStore::draw() { vstore->draw(); } void ParameterVertexStore::draw() { vstore->draw(); } void ExternalVertexStore::draw() { tempstore->draw(); } /******** S E L E C T _ B O X **************/ void VertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { consvstore->select_box(rx,ry,mx,my,end_v); if (end_v) return; altvstore->select_box(rx,ry,mx,my,end_v); if (end_v) return; repvstore->select_box(rx,ry,mx,my,end_v); if (end_v) return; termvstore->select_box(rx,ry,mx,my,end_v); if (end_v) return; paravstore->select_box(rx,ry,mx,my,end_v); if (end_v) return; extvstore->select_box(rx,ry,mx,my,end_v); if (end_v) return; ubvstore->select_box(rx,ry,mx,my,end_v); } void TemplateInstStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { instances->select_box(rx,ry,mx,my,end_v); } void NameInsensitiveVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { vertices->select_box(rx,ry,mx,my,end_v); } void NameSensitiveVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { if (vertices) vertices->select_box(rx,ry,mx,my,end_v); } void NameSensitiveVertexList::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { elm->select_box(rx,ry,mx,my,end_v); if (end_v) return; if (next) next->select_box(rx,ry,mx,my,end_v); } void NameSensitiveVertex::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { vertices->select_box(rx,ry,mx,my,end_v); if (end_v) return; tempinststore->select_box(rx,ry,mx,my,end_v); } void ConstructionVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { tempstore->select_box(rx,ry,mx,my,end_v); } void AlternationVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { tempstore->select_box(rx,ry,mx,my,end_v); } void RepetitionVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { tempstore->select_box(rx,ry,mx,my,end_v); } void TerminalVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { vstore->select_box(rx,ry,mx,my,end_v); } void UnboundVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { vstore->select_box(rx,ry,mx,my,end_v); } void ParameterVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { vstore->select_box(rx,ry,mx,my,end_v); } void ExternalVertexStore::select_box( int &rx, int &ry, int mx, int my, VertexObject*&end_v) { tempstore->select_box(rx,ry,mx,my,end_v); } /******** A P P E N D ***********/ void VertexStore::append(VertexObject *nv) { if (nv->isTemplateInst() && nv->get_template_name() == NULL) { ubvstore->append(nv); return; } switch(nv->get_kind()) { case CONS_VERTEX: consvstore->append(nv); break; case ALT_VERTEX: altvstore->append(nv); break; case REP_VERTEX: repvstore->append(nv); break; case TERM_VERTEX: termvstore->append(nv); break; case EXT_VERTEX: extvstore->append(nv); break; case PARAM_VERTEX: paravstore->append(nv); break; default: XBell(XtDisplay(draw_area),0); fprintf(stderr,"Unknow vertex kind.\n"); break; } } void ConstructionVertexStore::append(VertexObject *nv) { tempstore->append(nv); } void AlternationVertexStore::append(VertexObject *nv) { tempstore->append(nv); } void RepetitionVertexStore::append(VertexObject *nv) { tempstore->append(nv); } void TerminalVertexStore::append(VertexObject *nv) { nv->set_primary_flag(UNCLASSICFIED); vstore->append(nv); } void UnboundVertexStore::append(VertexObject *nv) { nv->set_primary_flag(UNCLASSICFIED); vstore->append(nv); } void ParameterVertexStore::append(VertexObject *nv) { nv->set_primary_flag(UNCLASSICFIED); vstore->append(nv); } void ExternalVertexStore::append(VertexObject *nv) { tempstore->append(nv); } char *VertexObject::get_vertex_name() { if (this->isTemplateInst()) return template_name->get_vertex_name(); else return name->get_vertex_name(); } void NameSensitiveVertexList::append(VertexObject *nv) { if (strcmp(nv->get_vertex_name(),elm->get_vertex_name()->get_vertex_name()) == 0) { nv->set_subhome(elm); if (nv->isTemplateInst()) { assert( nv->get_template_name() ); nv->set_primary_flag(UNCLASSICFIED); nv->set_home(elm->get_tempinststore()->get_instances()); elm->get_tempinststore()->append(nv); nv->set_template_name(elm->get_vertex_name()); } else { delete nv->get_name(); nv->set_name(elm->get_vertex_name()); delete nv->get_parassignstore(); nv->set_parassignstore(elm->get_primary()->get_parassignstore()); nv->set_primary_flag(NONPRIMARY); nv->set_home(elm->get_vertices()); elm->get_primary()->set_primary_flag(PRIMARY_OF); elm->get_vertices()->append(nv); } } else if (next) next->append(nv); else { assert( !nv->isTemplateInst() ); next = new NameSensitiveVertexList(); next->set_elm(new NameSensitiveVertex()); nv->set_primary_flag(PRIMARY); nv->set_subhome(next->get_elm()); nv->set_home(next->get_elm()->get_vertices()); next->get_elm()->get_vertices()->append(nv); next->get_elm()->set_primary(nv); delete next->get_elm()->get_vertex_name(); next->get_elm()->set_vertex_name(nv->get_name()); if (nv->get_kind() != EXT_VERTEX) vertex_store->get_localvertices()->append(next->get_elm()); } } void NameSensitiveVertexStore::append(VertexObject *nv) { if (vertices) vertices->append(nv); else { assert( !nv->isTemplateInst() ); vertices = new NameSensitiveVertexList(); vertices->set_elm(new NameSensitiveVertex()); nv->set_subhome(vertices->get_elm()); nv->set_primary_flag(PRIMARY); nv->set_home(vertices->get_elm()->get_vertices()); vertices->get_elm()->get_vertices()->append(nv); vertices->get_elm()->set_primary(nv); delete vertices->get_elm()->get_vertex_name(); vertices->get_elm()->set_vertex_name(nv->get_name()); if (nv->get_kind() != EXT_VERTEX) vertex_store->get_localvertices()->append(vertices->get_elm()); } } void NameInsensitiveVertexStore::append(VertexObject *nv) { nv->set_primary_flag(UNCLASSICFIED); nv->set_home(vertices); vertices->append(nv); } void TemplateInstStore::append(VertexObject *nv) { nv->set_primary_flag(UNCLASSICFIED); nv->set_home(instances); instances->append(nv); } void NameSensitiveVertex::append_parassign(ParameterEdge *npe) { primary->append_parassign_to_primary(npe); vertices->append_parassign(npe); } void TemplateInstStore::append_parassign(ParameterEdge *npe) { instances->append_parassign(npe); } void ObjectStore::append_parassign(ParameterEdge *npe) { if (objects) objects->append_parassign(npe); } void GraphicsObjectList::append_parassign(ParameterEdge *npe) { elm->append_parassign(npe); if (next) next->append_parassign(npe); } void GraphicsObject::append_parassign(ParameterEdge *npe) { assert(this->get_kind() == CONS_VERTEX || this->get_kind() == ALT_VERTEX ||this->get_kind() == REP_VERTEX || this->get_kind() == EXT_VERTEX); } void VertexObject::append_parassign_to_primary(ParameterEdge *npe) { assert(this->get_kind() == CONS_VERTEX || this->get_kind() == ALT_VERTEX ||this->get_kind() == REP_VERTEX || this->get_kind() == EXT_VERTEX); parassignstore->append_parassign(npe); } void VertexObject::append_parassign(ParameterEdge *npe) { assert(this->get_kind() == CONS_VERTEX || this->get_kind() == ALT_VERTEX ||this->get_kind() == REP_VERTEX || this->get_kind() == EXT_VERTEX); this->get_incoming_parinstedge_store()->add_parassign_to_inst(npe); } int NameSensitiveVertex::vertexInUse() { return vertices->vertexInUse(); } int ObjectStore::vertexInUse() { if ( objects ) return objects->vertexInUse(); else return 0; } int GraphicsObjectList::vertexInUse() { if (elm->vertexInUse()) return 1; else if (next) return next->vertexInUse(); else return 0; } int GraphicsObject::vertexInUse() { assert(this->get_kind() == CONS_VERTEX ||this->get_kind() == ALT_VERTEX || this->get_kind() == REP_VERTEX || this->get_kind() == EXT_VERTEX || this->get_kind() == PAR_INST_EDGE); return 0; } int VertexObject::vertexInUse() { if (incoming_consedge_store->empty() && incoming_repedge_store->empty() && incoming_inhedge_store->empty() && incoming_paredge_store->empty() ) return incoming_parinstedge_store->vertexInUse(); else { if (incoming_consedge_store->empty() && incoming_repedge_store->empty()) return 0; else return 1; } } int EdgeObject::vertexInUse() { return this->get_from_vertex()->vertexInUse(); } void VertexStore::remove_from_unbound(VertexObject *v) { ubvstore->remove_from_unbound(v); } void UnboundVertexStore::remove_from_unbound(VertexObject *v) { vstore->remove_from_unbound(v); } void NameInsensitiveVertexStore::remove_from_unbound(VertexObject *v) { vertices->deleteGO(v); } void ObjectStore::deleteGO(GraphicsObject *go) { if (objects) { if ( ((char*)((GraphicsObject *)objects->get_elm())) == ((char*)((GraphicsObject *)go))) { GraphicsObjectList * t = objects; objects = objects->get_next(); if (objects) objects->set_prev(NULL); delete t; } else objects->deleteGO(go); } } void GraphicsObjectList::deleteGO(GraphicsObject *go) { if (next) { if ( ((char*)((GraphicsObject *)next->get_elm())) == ((char*)((GraphicsObject *)go))) { GraphicsObjectList * t = next; next = next->get_next(); if (next) next->set_prev(NULL); delete t; } else next->deleteGO(go); } } void NameSensitiveVertex::no_duplicate_target(int &ret,draw_kind k,char *n) { vertices->no_duplicate_target(ret,k,n); } void ObjectStore::no_duplicate_target(int &ret,draw_kind k,char *n) { if (objects) objects->no_duplicate_target(ret,k,n); } void GraphicsObjectList::no_duplicate_target(int &ret,draw_kind k,char *n) { elm->no_duplicate_target(ret,k,n); if (ret == 0) return; if (next) next->no_duplicate_target(ret,k,n); } void GraphicsObject::no_duplicate_target(int &ret,draw_kind k,char *n) { assert( this->get_kind() == CONS_VERTEX || this->get_kind() == ALT_VERTEX || this->get_kind() == REP_VERTEX || this->get_kind() == EXT_VERTEX); } void VertexObject::no_duplicate_target(int &ret,draw_kind k,char *n) { assert( this->get_kind() == CONS_VERTEX || this->get_kind() == ALT_VERTEX || this->get_kind() == REP_VERTEX || this->get_kind() == EXT_VERTEX); switch(k) { case PAR_EDGE: outgoing_paredge_store->no_duplicate_edge(ret,n); break; case INH_EDGE: outgoing_inhedge_store->no_duplicate_edge(ret,n); break; case ALT_EDGE: outgoing_altedge_store->no_duplicate_edge(ret,n); break; case PAR_INST_EDGE: outgoing_parinstedge_store->no_duplicate_edge(ret,n); break; default: assert(0); } } void ObjectStore::no_duplicate_edge(int &ret,char *n) { if (objects) objects->no_duplicate_edge(ret,n); } void GraphicsObjectList::no_duplicate_edge(int &ret,char *n) { elm->no_duplicate_edge(ret,n); if (ret == 0) return; if (next) next->no_duplicate_edge(ret,n); } void GraphicsObject::no_duplicate_edge(int &ret,char *n) { assert( this->get_kind() == INH_EDGE || this->get_kind() == PAR_EDGE || this->get_kind() == PAR_INST_EDGE || this->get_kind() == ALT_EDGE); } void EdgeObject::no_duplicate_edge(int &ret,char *n) { assert( this->get_kind() == INH_EDGE || this->get_kind() == PAR_EDGE || this->get_kind() == PAR_INST_EDGE || this->get_kind() == ALT_EDGE); if (strcmp(n,this->get_to_vertex()->get_vertex_name())==0) ret = 0; } int NameSensitiveVertex::has_rep_edge() { return vertices->has_rep_edge(); } int ObjectStore::has_rep_edge() { if (objects) return objects->has_rep_edge(); else return 0; } int GraphicsObjectList::has_rep_edge() { if (elm->has_rep_edge()) return 1; else if (next) return next->has_rep_edge(); else return 0; } int RepetitionVertex::has_rep_edge() { return !this->get_outgoing_repedge_store()->empty(); } void NameSensitiveVertexStore::append(NameSensitiveVertex *nv) { if (vertices==NULL) { vertices = new NameSensitiveVertexList(); vertices->set_elm(nv); } else vertices->append(nv); } void NameSensitiveVertexList::append(NameSensitiveVertex *nv) { if (next==NULL) { next = new NameSensitiveVertexList(); next->set_elm(nv); } else next->append(nv); }