/////////////////////////////////////////////////////////////////////// // // File: linkops.cc // // Description: // // This file contains all BDE code responsible for controlling link operations. // The code has been taken from the BDE 1.0 buttondown.cc, buttonup.cc // and buttonmoved.cc files. // // History: // // 94/7/18: RJL added sample code (comments) to the stub for link_delete // 05/02/93 rboccuzz created. // // $Log: linkops.cc,v $ // Revision 1.3 1995/05/13 02:32:59 hcpatel // Implemented corrected state models for link create and link delete operations. // // Revision 1.2 1995/04/04 04:41:29 cgopal // File bde20 and others were fixed so that multiple definitions // of variables were eliminated. All enumarated types were capitializes and give // n a prefix. // // Arguments to XtAddcallback was casted to the right type. Handler.cc // was also fixed to use right variables. // // Revision 1.10 1994/08/23 01:48:26 lechner // added sample code (comments) to the stub for link_delete // // Revision 1.9 1994/05/07 23:42:23 dgrant // In routine link_create changed calls from infomessage to // displayMessage. // // Revision 1.8 1994/04/16 17:19:31 tseeley // Changed global Filename to current_filename. // // Revision 1.7 1994/04/01 00:06:57 mtorpey // fixed problem with genv8 changes. // // Revision 1.6 1994/03/31 19:21:37 namin // version 8 changes // // Revision 1.5 1994/03/12 16:44:31 lking // Added the include file "prototype.h" which contains all the function // declarations. Removed all external function declarations from this file. // // Revision 1.4 1994/03/11 22:18:55 lking // Removed debug printf statements from the file. // // Revision 1.3 1994/03/11 20:58:51 lking // Reformatted the header comment to make it more readable. Move rcsid // below the header comment. // // Revision 1.2 1994/03/09 18:27:44 jrichard // Added a rcs log replacement statement to all .cc files as part of the // header comment. THis places all checkin comments directly into the // header comment. // /////////////////////////////////////////////////////////////////////// #ifndef lint static char rcsid[] = "$Id: linkops.cc,v 1.3 1995/05/13 02:32:59 hcpatel Exp $"; #endif /********************** System include files *******************************/ #include #include #include #include #include #include #include /********************** Program include files ******************************/ #include "tags.h" #include "bde.h" #include "graph.h" #include "state.h" #include "prototype.h" /********************** Macro defines **************************************/ /********************** Global and external variables **********************/ extern char *current_filename; extern Widget canvas; extern float selectedx, selectedy; extern Select selected; extern Cursor arrow, dot, addcross, pirate; extern graphobject *currentselection; /*************************************************************************** * Name: * void link_create(XButtonEvent*, int, link_attributes*, int) * Added by: * ??? * Modified by: * hcpatel & mmaliset - bdesrc 95s523 * A generic selection routine, select_HN(), is used to select a Node for * source and destination objects. This implements improved state model * suggested by Prof. Lechner. * Description: * Link Create performs the creation of the links. It does this * based on the button event and state information passed to it. * All code within this function was lifted from the button*.cc files. * button_op is one of : BUTTON_UP, BUTTON_DOWN, BUTTON_MOVED * Uses: * DCtoWC(), Ggroup method select_HN(widget, int, int), changeCanvasCursor() * Ggroup->addlink(), displayMessage(), unselect() * Side effects: * NONE. * Error Handling: * NONE ***************************************************************************/ ANCHORTAG(link_create) void link_create (XButtonEvent *event, int state, /* Canvas State */ link_attributes *attribute, int button_op) { float sx, sy; static graphobject *firstselect; DCtoWC(event->x, event->y, &sx, &sy); switch (state) { ANCHORTAG(link_create_SA) case SArrow: switch (button_op) { ANCHORTAG(link_create_SA_BDE) case BUTTON_DOWN_EVENT: topobject->select_HN(canvas, (int)sx, (int)sy); firstselect = currentselection; break; ANCHORTAG(link_create_SA_BUE) case BUTTON_UP_EVENT: topobject->select_HN(canvas, (int)sx, (int)sy); /* Create link only if firstselection and second selection both are separate Nodes */ if (currentselection != NULL && firstselect != NULL) { if ( firstselect != currentselection) { topobject->addlink(firstselect, currentselection); } else displayMessage("Self loop is not implemented yet\n"); } else displayMessage("Selected source/destination is not a Node\n"); changeCanvasCursor(addcross); unselect(); break; ANCHORTAG(link_create_SA_BME) case BUTTON_MOVED_EVENT: if(currentselection != NULL) changeCanvasCursor(dot); displayMessage("Choose the destination Node of Link\n"); break; default: /* illegal value for button_op variable */ //add PostErrorMsg() to handle error message - phsia 12/8/95 PostErrorMsg(SArrow); break; } break; default: /* illegal value for state variable */ fprintf(stderr, "Out of State in function link_create.\n"); fprintf(stderr, "switch on state\n"); fprintf(stderr, "Report this to Professor Lechner.\n"); break; } } // end void link_create() /*************************************************************************** * Name: * void link_delete(XButtorEvent*, int, link_attributes*, int) * Added by: * ??? * Modified by: * hcpatel & mmaliset - bdesrc 95s523 * A generic selection method select_HL is used to select a link from the * object list. This implements improved state model suggested by * Prof. Lechner. * Description: * Link Delete performs the deletetion of one link and all * its labels and bendpoints (HI and HP children). It does this * based on the button event and state information passed to it. * All code within this function was lifted from the button*.cc files. * button_op is one of: BUTTON_UP, BUTTON_DOWN, BUTTON_MOVED * Uses: * DCtoWC(), select_HL(widget, int, int), changeCanvasCursor(), * selected.changeAttribState(), docut() * Error handling: * NONE. * Side effects: * NONE. ***************************************************************************/ ANCHORTAG(link_delete) void link_delete (XButtonEvent *event, int state, /* Canvas State */ link_attributes *attribute, int button_op) { float sx, sy; static graphobject *selected_link = NULL; DCtoWC(event->x, event->y, &sx, &sy); switch (state) { ANCHORTAG(link_delete_SD1) case SDlink1: switch (button_op) { ANCHORTAG(link_delete_SD1_BDE) case BUTTON_DOWN_EVENT: topobject->select_HL(canvas, (int)sx, (int)sy); selected_link = currentselection; if(currentselection != NULL) { selected.changeAttribState(SDlink2); changeCanvasCursor(pirate); } break; ANCHORTAG(link_delete_SD1_BUE) case BUTTON_UP_EVENT: break; ANCHORTAG(link_delete_SD1_BME) case BUTTON_MOVED_EVENT: break; default: //add PostErrorMsg() to handle error message - phsia 12/8/95 PostErrorMsg(SDlink1); break; } break; ANCHORTAG(link_delete_SD2) case SDlink2: switch (button_op) { ANCHORTAG(link_delete_SD2_BDE) case BUTTON_DOWN_EVENT: topobject->select_HL(canvas, (int)sx, (int)sy); if (currentselection != NULL && selected_link == currentselection) { docut((Widget) 0,0,0); selected.changeAttribState(SDlink1); changeCanvasCursor(arrow); } else selected_link = currentselection; break; ANCHORTAG(link_delete_SD2_BUE) case BUTTON_UP_EVENT: break; ANCHORTAG(link_delete_SD2_BME) case BUTTON_MOVED_EVENT: break; default: /* illegal value for button_op variable */ //add PostErrorMsg() to handle error message - phsia 12/8/95 PostErrorMsg(SDlink2); break; } break; default: /* illegal value for state variable */ fprintf(stderr, "Out of State in function node_delete.\n"); fprintf(stderr, "switch on state\n"); fprintf(stderr, "Report this to Professor Lechner.\n"); break; } } // end void link_delete() /*************************************************************************** * Description: * Link Move performs the moving of the links. It does this * based on the button event and state information passed to it. * All code within thei function was lifted from the button*.cc files. * * Error handling: * NONE. * Side effects: * NONE. ***************************************************************************/ ANCHORTAG(link_move) void link_move (XButtonEvent *event, int state, link_attributes *attribute, int button_op) /* BUTTON_UP, BUTTON_DOWN, BUTTON_MOVED */ { /* Stub function, not written yet */ } /*************************************************************************** * Description: * Reverse Arrow performs the reversing of the direction of link arrow * It does this based on the button event and state information passed * to it. All code within their function was lifted from the * buttonevent.cc files. * * Error handeling: * NONE. * Side effects: * NONE. **************************************************************************/ extern float savedx, savedy; ANCHORTAG(reverse_arrow) void reverse_arrow (XButtonEvent *event, int state, /* Canvas State */ link_attributes *attribute, int button_op) { float sx, sy; #ifdef GENV6 char *id; #else hcg_key id; #endif int chen_pcount, chen_num; DCtoWC(event->x, event->y, &sx, &sy); switch (state) { /* Reverse the direction of the link */ ANCHORTAG(reverse_arrow_SR) case SReverse: switch (button_op) { ANCHORTAG(reverse_arrow_SR_BDE) case BUTTON_DOWN_EVENT: unselect(); unselect(); selection(canvas,(int)sx,(int)sy); break; ANCHORTAG(reverse_arrow_SR_BME) case BUTTON_MOVED_EVENT: break; ANCHORTAG(reverse_arrow_SR_BUE) case BUTTON_UP_EVENT: if(currentselection != 0) { #ifdef GENV6 id = currentselection->getid(); #else id = (hcg_key)currentselection->getid(); #endif pr_find(HN, HNid, id); if (HNcurr != NULL){ unselect(); currentselection = 0; } else { pr_find(HL, HLid, id); if (HLcurr != NULL) selected.changeAttribState(SReverse_Arrow); } } break; default: /* illegal value for button_op variable */ //add PostErrorMsg() to handle error messsage - phsia 12/8/95 PostErrorMsg(SReverse); break; } break; /* Reverse the link arrow */ ANCHORTAG(reverse_arrow_RA) case SReverse_Arrow: switch (button_op) { ANCHORTAG(reverse_arrow_RA_BDE) case BUTTON_DOWN_EVENT: unselect(); selection(canvas,(int)sx,(int)sy); chen_num=0; if(currentselection != 0) { #ifdef GENV6 id = currentselection->getid(); #else id = (hcg_key)currentselection->getid(); #endif pr_find(HL,HLid,id); if (HLcurr != NULL){ chen_pcount = HLcurr->HPcount - 1; child_loop(HL,HP,HPid,HLid) { if (HPcurr != NULL){ if (chen_num == chen_pcount) { switch(HPcurr->hsegpattern[0]){ case '0': case 'P': HPcurr->hsegpattern[0] = '1'; break; case '1': HPcurr->hsegpattern[0] = '2'; break; case '2': HPcurr->hsegpattern[0] = '0'; break; default: break; } } else { switch(HPcurr->hsegpattern[0]){ case 'P': HPcurr->hsegpattern[0] = '0'; break; default: break; } } } chen_num++; } } else { unselect(); currentselection = 0; } } break; ANCHORTAG(reverse_arrow_RA_BME) case BUTTON_MOVED_EVENT: break; ANCHORTAG(reverse_arrow_RA_BUE) case BUTTON_UP_EVENT: if(currentselection != 0){ ReDraw(); } break; default: /* illegal value for button_op variable */ //add PostErrorMsg() to handle error messsage - phsia 12/8/95 PostErrorMsg(SReverse_Arrow); break; } break; default: /* illegal value for state variable */ fprintf(stderr, "Out of State in function reverse_arrow().\n"); fprintf(stderr, "switch on state\n"); fprintf(stderr, "Report this to Professor Lechner.\n"); break; } } /*------------------ ReDirection ------------------------- void dirdo() { FILE *dir_file; void loadobjects(char*); void clearObjects(); if((dir_file = fopen("wchen","r")) == NULL){ return; } clearObjects(); pr_free(); loadobjects("wchen"); } */