home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / linkedit / linkedit.lha / link-edit / LinkEdit / Link / link_bp.c next >
Encoding:
C/C++ Source or Header  |  1991-03-13  |  14.2 KB  |  415 lines

  1. #include <stdio.h>
  2. #include <X11/Xlib.h>
  3. #include "link_types.h"
  4. #include "link_global.h"
  5.  
  6. LinkButtonPress(gnrc,event)
  7.  
  8. LinkStatus *gnrc;
  9. XEvent *event;
  10.  
  11. {
  12.   int x,y,x1,y1,delta_x,delta_y;
  13.   LinkPointList *pnt,*tmp_pnt,*prev_pnt;
  14.   LinkCrossingList *crssng;
  15.   LinkList *lnk;
  16.   XEvent evnt;
  17.   double temp,scale;
  18.   int x0,y0,width,height;
  19.   int xcoord,ycoord,xsize,ysize;
  20.   Window root,child;  /* Junk for XQueryPointer */
  21.   int root_x,root_y;
  22.   unsigned int buttons;
  23.  
  24.   x = event->xbutton.x; y = event->xbutton.y;
  25.   switch(gnrc->choice[0]) {
  26.  
  27.      case LINK_MOVE_POINT:
  28.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  29.           LinkPrintMessage(gnrc,"No point chosen. Try again.");
  30.           break;
  31.          }
  32.        if((pnt = LinkFindPoint(gnrc,lnk,x,y)) == NULL) {
  33.           LinkPrintMessage(gnrc,"No point chosen. Try again.");
  34.           break;
  35.          }
  36.        gnrc->current_link = lnk;
  37.        x1 = x; y1 = y;
  38.        while(1) {
  39.            if(XCheckMaskEvent(dpy,ButtonReleaseMask,&evnt)) break;
  40.            /* Draw feedback line */
  41.            if(XQueryPointer(dpy,gnrc->TopWindow,&root,&child,
  42.                             &root_x,&root_y,&x1,&y1,&buttons)) {
  43.               if(pnt->previous != &(lnk->point)) {
  44.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  45.                           pnt->previous->dcx,pnt->previous->dcy,x1,y1);
  46.                 }
  47.               else if(lnk->closed) {
  48.                       prev_pnt = &(lnk->point);
  49.                       while(prev_pnt->next != NULL) prev_pnt = prev_pnt->next;
  50.                       XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  51.                              prev_pnt->dcx,prev_pnt->dcy,x1,y1);
  52.                      }
  53.  
  54.               if(pnt->next != NULL) {
  55.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  56.                          pnt->next->dcx,pnt->next->dcy,x1,y1);
  57.                 }
  58.               else if(lnk->closed) {
  59.                       XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  60.                          lnk->point.next->dcx,lnk->point.next->dcy,x1,y1);
  61.                      }
  62.               XFlush(dpy);
  63.               LinkPause(LINK_PAUSE);
  64.               if(pnt->previous != &(lnk->point)) {
  65.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  66.                           pnt->previous->dcx,pnt->previous->dcy,x1,y1);
  67.                 }
  68.               else if(lnk->closed) {
  69.                       prev_pnt = &(lnk->point);
  70.                       while(prev_pnt->next != NULL) prev_pnt = prev_pnt->next;
  71.                       XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  72.                              prev_pnt->dcx,prev_pnt->dcy,x1,y1);
  73.                      }
  74.  
  75.               if(pnt->next != NULL) {
  76.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  77.                          pnt->next->dcx,pnt->next->dcy,x1,y1);
  78.                 }
  79.               else if(lnk->closed) {
  80.                       XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  81.                          lnk->point.next->dcx,lnk->point.next->dcy,x1,y1);
  82.                      }
  83.              }
  84.           }
  85.        x1 = evnt.xbutton.x; y1 = evnt.xbutton.y;
  86.        pnt->dcx = x1; pnt->dcy = y1;
  87.        LinkComputePointWorldCoords(gnrc,pnt);
  88.  
  89.        LinkReComputeEdgeCrossings(gnrc,lnk,pnt);
  90.        if(pnt->previous != &(lnk->point))
  91.           LinkReComputeEdgeCrossings(gnrc,lnk,pnt->previous);
  92.        else
  93.           if(lnk->closed) {  /* Recompute edge from last point */
  94.              prev_pnt = &(lnk->point);
  95.              while(prev_pnt->next != NULL) prev_pnt = prev_pnt->next;
  96.              LinkReComputeEdgeCrossings(gnrc,lnk,prev_pnt);
  97.             }
  98.  
  99.        XClearWindow(dpy,gnrc->TopWindow);
  100.        ReDrawLinkTopWindow(gnrc);
  101.        LinkPrintMessage(gnrc,"You may move another point.");
  102.        break;
  103.  
  104.      case LINK_ADD_POINT:
  105.        LinkAddPoint(gnrc,x,y);
  106.        break;
  107.  
  108.      case LINK_DELETE_POINT:
  109.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  110.           LinkPrintMessage(gnrc,"No point chosen. Try again.");
  111.           break;
  112.          }
  113.        if((pnt = LinkFindPoint(gnrc,lnk,x,y)) == NULL) {
  114.           LinkPrintMessage(gnrc,"No point chosen. Try again.");
  115.           break;
  116.          }
  117.        gnrc->current_link = lnk;
  118.        LinkDeletePoint(gnrc,lnk,pnt);
  119.  
  120.        XClearWindow(dpy,gnrc->TopWindow);
  121.        ReDrawLinkTopWindow(gnrc);
  122.        LinkPrintMessage(gnrc,"You may delete another point.");
  123.        break;
  124.  
  125.      case LINK_FLIP_CROSSING:
  126.        if((crssng = LinkFindCrossing(gnrc,x,y)) == NULL) {
  127.           LinkPrintMessage(gnrc,"No crossing chosen. Try again.");
  128.           break;
  129.          }
  130.  
  131.        if(crssng->z > 0.0) {
  132.           crssng->z = -1.0; crssng->crossing->z = 1.0;
  133.          }
  134.        else {
  135.           crssng->z = 1.0; crssng->crossing->z = -1.0;
  136.          }
  137.        XClearWindow(dpy,gnrc->TopWindow);
  138.        ReDrawLinkTopWindow(gnrc);
  139.        
  140.        LinkPrintMessage(gnrc,"You may flip another crossing.");
  141.        break;
  142.  
  143.      case LINK_SELECT_LINK:
  144.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  145.           LinkPrintMessage(gnrc,"No link chosen. Try again.");
  146.           break;
  147.          }
  148.        gnrc->current_link = lnk;
  149.        XClearWindow(dpy,gnrc->TopWindow);
  150.        ReDrawLinkTopWindow(gnrc);
  151.        
  152.        LinkPrintMessage(gnrc,"You may select a different link.");
  153.        break;
  154.  
  155.      case LINK_HIDE_LINK:
  156.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  157.           LinkPrintMessage(gnrc,"No link chosen. Try again.");
  158.           break;
  159.          }
  160.        lnk->visible = LINK_HIDE; 
  161.        XClearWindow(dpy,gnrc->TopWindow);
  162.        ReDrawLinkTopWindow(gnrc);
  163.        
  164.        LinkPrintMessage(gnrc,"You may hide another strand.");
  165.        break;
  166.  
  167.      case LINK_JOIN_SELECT_HEAD:
  168.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  169.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  170.           break;
  171.          }
  172.        if(lnk->closed) {
  173.           LinkPrintMessage(gnrc,"Strand must be open.\n");
  174.           break;
  175.          }
  176.        /* If user chose actual start, reverse link */
  177.        if((pnt = LinkFindPoint(gnrc,lnk,x,y)) == NULL) {
  178.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  179.           break;
  180.          }
  181.        if(pnt == lnk->point.next) {
  182.           LinkReverseArrows(gnrc,lnk);
  183.          }
  184.  
  185.        if(gnrc->current_link != lnk) {
  186.           gnrc->current_link = lnk;
  187.           XClearWindow(dpy,gnrc->TopWindow);
  188.           ReDrawLinkTopWindow(gnrc);
  189.          }
  190.        gnrc->choice[0] = LINK_JOIN_SELECT_TAIL;
  191.        LinkPrintMessage(gnrc,"Select start of second link.");
  192.        break;
  193.  
  194.      case LINK_JOIN_SELECT_TAIL:
  195.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  196.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  197.           break;
  198.          }
  199.        if(lnk == gnrc->current_link) {
  200.           LinkPrintMessage(gnrc,"Select strand other than current one.");
  201.           break;
  202.          }
  203.        if(lnk->closed) {
  204.           LinkPrintMessage(gnrc,"Strand must be open.\n");
  205.           break;
  206.          }
  207.        /* if user chose actual end, reverse link */
  208.        if((pnt = LinkFindPoint(gnrc,lnk,x,y)) == NULL) {
  209.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  210.           break;
  211.          }
  212.        if(pnt != lnk->point.next) {  /* Check if last one chosen */
  213.           tmp_pnt = &(lnk->point);
  214.           while(tmp_pnt->next != NULL) tmp_pnt = tmp_pnt->next;
  215.           if(tmp_pnt == pnt) LinkReverseArrows(gnrc,lnk);
  216.          }
  217.        LinkJoinLinks(gnrc,gnrc->current_link,lnk);
  218.        XClearWindow(dpy,gnrc->TopWindow);
  219.        ReDrawLinkTopWindow(gnrc);
  220.  
  221.        gnrc->choice[0] = LINK_JOIN_SELECT_HEAD;
  222.        LinkPrintMessage(gnrc,
  223.                    "You may join two more strands. Select the first...");
  224.        break;
  225.  
  226.      case LINK_REVERSE_ARROWS:
  227.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  228.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  229.           break;
  230.          }
  231.        LinkReverseArrows(gnrc,lnk);
  232.        gnrc->current_link = lnk;
  233.        XClearWindow(dpy,gnrc->TopWindow);
  234.        ReDrawLinkTopWindow(gnrc);
  235.        LinkPrintMessage(gnrc,"You may reverse another strand.");
  236.        break;
  237.  
  238.      case LINK_OPEN_LINK:
  239.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  240.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  241.           break;
  242.          }
  243.        gnrc->current_link = lnk;
  244.        LinkOpenCurrentLink((VOID *) gnrc);
  245.        XClearWindow(dpy,gnrc->TopWindow);
  246.        ReDrawLinkTopWindow(gnrc);
  247.        LinkPrintMessage(gnrc,"You may open another strand.");
  248.        break;
  249.  
  250.      case LINK_DELETE_LINK:
  251.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  252.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  253.           break;
  254.          }
  255.        gnrc->current_link = lnk;
  256.        LinkDeleteCurrentSelection((VOID *) gnrc);
  257.        XClearWindow(dpy,gnrc->TopWindow);
  258.        ReDrawLinkTopWindow(gnrc);
  259.        LinkPrintMessage(gnrc,"You may delete another strand.");
  260.        break;
  261.  
  262.      case LINK_CLOSE_LINK:
  263.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  264.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  265.           break;
  266.          }
  267.        gnrc->current_link = lnk;
  268.        LinkCloseCurrentLink((VOID *) gnrc);
  269.        XClearWindow(dpy,gnrc->TopWindow);
  270.        ReDrawLinkTopWindow(gnrc);
  271.        LinkPrintMessage(gnrc,"You may close another strand.");
  272.        break;
  273.  
  274.      case LINK_TRANSLATE_LINK:
  275.        if((lnk = LinkFindLink(gnrc,x,y)) == NULL) {
  276.           LinkPrintMessage(gnrc,"No strand chosen. Try again.");
  277.           break;
  278.          }
  279.        while(1) {
  280.            if(XCheckMaskEvent(dpy,ButtonReleaseMask,&evnt)) break;
  281.            /* Draw feedback link */
  282.            if(XQueryPointer(dpy,gnrc->TopWindow,&root,&child,
  283.                             &root_x,&root_y,&x1,&y1,&buttons)) {
  284.               if((pnt = lnk->point.next) == NULL) continue;
  285.               while(pnt->next != NULL) {
  286.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  287.                           pnt->dcx + x1-x,pnt->dcy + y1-y,
  288.                           pnt->next->dcx + x1-x, pnt->next->dcy + y1-y);
  289.                  pnt = pnt->next;
  290.                 }
  291.               if(lnk->closed) {
  292.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  293.                      pnt->dcx + x1-x,pnt->dcy + y1-y,
  294.                     lnk->point.next->dcx + x1-x, lnk->point.next->dcy + y1-y);
  295.                 }
  296.               XFlush(dpy);
  297.               LinkPause(LINK_PAUSE);
  298.               if((pnt = lnk->point.next) == NULL) continue;
  299.               while(pnt->next != NULL) {
  300.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  301.                           pnt->dcx + x1-x,pnt->dcy + y1-y,
  302.                           pnt->next->dcx + x1-x, pnt->next->dcy + y1-y);
  303.                  pnt = pnt->next;
  304.                 }
  305.               if(lnk->closed) {
  306.                  XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  307.                      pnt->dcx + x1-x,pnt->dcy + y1-y,
  308.                     lnk->point.next->dcx + x1-x, lnk->point.next->dcy + y1-y);
  309.                 }
  310.              }
  311.           }
  312.        delta_x = evnt.xbutton.x - x; delta_y = evnt.xbutton.y - y;
  313.        LinkDCTranslateLink(gnrc,lnk,delta_x,delta_y);
  314.        gnrc->current_link = lnk;
  315.        
  316.        XClearWindow(dpy,gnrc->TopWindow);
  317.        ReDrawLinkTopWindow(gnrc);
  318.        LinkPrintMessage(gnrc,"Click and drag to translate another link.");
  319.        break;
  320.  
  321. /***
  322.      case LINK_ROTATE_LINK:
  323.        break;
  324. ***/
  325.  
  326.      case LINK_SHIFT_VIEW:
  327.        while(1) {
  328.            if(XCheckMaskEvent(dpy,ButtonReleaseMask,&evnt)) break;
  329.            /* Draw feedback line */
  330.            if(XQueryPointer(dpy,gnrc->TopWindow,&root,&child,
  331.                             &root_x,&root_y,&x1,&y1,&buttons)) {
  332.               XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  333.                           x,y,x1,y1);
  334.               XFlush(dpy);
  335.               LinkPause(LINK_PAUSE);
  336.               XDrawLine(dpy,gnrc->TopWindow,gnrc->xor_gc,
  337.                          x,y,x1,y1);
  338.  
  339.              }
  340.           }
  341.        delta_x = evnt.xbutton.x - x; delta_y = evnt.xbutton.y - y;
  342.        gnrc->origin.dcx += delta_x; 
  343.        gnrc->origin.dcy += delta_y;
  344.        LinkComputeDeviceCoords(gnrc);
  345.        XClearWindow(dpy,gnrc->TopWindow);
  346.        ReDrawLinkTopWindow(gnrc);
  347.        LinkPrintMessage(gnrc,"Click and drag to shift view.");
  348.        break;
  349.  
  350.      case LINK_ZOOM_VIEW:
  351.        width = (int) ((double) (gnrc->width) * LINK_FEEDBACK_XFRACTION);
  352.        height = (int) ((double) (gnrc->height) * LINK_FEEDBACK_YFRACTION);
  353.        x0 = gnrc->width/2 - width/2;
  354.        y0 = gnrc->height/2 - height/2;
  355.        XDrawRectangle(dpy,gnrc->TopWindow,gnrc->gc,x0,y0,
  356.                     width,height); 
  357.        while(1) {
  358.            if(XCheckMaskEvent(dpy,ButtonReleaseMask,&evnt)) break;
  359.            /* Draw feedback rectangle */
  360.            if(XQueryPointer(dpy,gnrc->TopWindow,&root,&child,
  361.                             &root_x,&root_y,&x1,&y1,&buttons)) {
  362.  
  363.               xcoord = x0 - x1 + x;
  364.               xsize = width + 2*(x1-x);
  365.               if(xsize < 1) xsize = 1;
  366.               scale =  (double) xsize/(double) width;
  367.  
  368.               ysize = (int) (0.5 + scale * (double) height);
  369.               ycoord = gnrc->height/2 - ysize/2;
  370.               if(ysize < 1) ysize = 1;
  371.  
  372.               XDrawRectangle(dpy,gnrc->TopWindow,gnrc->xor_gc,
  373.                               xcoord,ycoord,xsize,ysize);
  374.               XFlush(dpy);
  375.               LinkPause(LINK_PAUSE);
  376.               XDrawRectangle(dpy,gnrc->TopWindow,gnrc->xor_gc,
  377.                               xcoord,ycoord,xsize,ysize);
  378.              }
  379.           }
  380.  
  381.        gnrc->xscale /= scale; 
  382.        gnrc->yscale /= scale; 
  383.        LinkComputeDeviceCoords(gnrc);
  384.        XClearWindow(dpy,gnrc->TopWindow);
  385.        ReDrawLinkTopWindow(gnrc);
  386.        LinkPrintMessage(gnrc,"You may zoom view again.");
  387.        break;
  388.  
  389. /***
  390.  
  391.      case LINK_SCALE_LINK:
  392.        while(1) {
  393.            XNextEvent(dpy,&evnt);
  394.            if(evnt.type == ButtonRelease) break;
  395.           }
  396.        temp = LINK_X_SCALE*(double) (evnt.xbutton.x - x)/xppmm; 
  397.        xscale = (temp < 0) ? 1.0/(1.0-temp): 1.0 + temp;
  398.  
  399.        temp = LINK_Y_SCALE*(double) (y-evnt.xbutton.y)/yppmm;
  400.        yscale = (temp < 0) ? 1.0/(1.0-temp): 1.0 + temp;
  401.        pnt = gnrc->point.next;
  402.        while(pnt != NULL) {
  403.           pnt->x *= xscale; pnt->y *= yscale;
  404.           pnt = pnt->next;
  405.          }
  406.        LinkComputeDeviceCoords(gnrc);
  407.        XClearWindow(dpy,gnrc->TopWindow);
  408.        ReDrawLinkTopWindow(gnrc);
  409.        LinkPrintMessage(gnrc,"You may scale link again.");
  410.        break;
  411. *****/
  412.  
  413.     }
  414. }
  415.