home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / editor / me / linedraw.m < prev    next >
Text File  |  1994-01-31  |  5KB  |  249 lines

  1. #include "mekeys.h"
  2.  
  3. #define ERR  (-1)
  4. #define DIR_UP     0
  5. #define DIR_DOWN   1
  6. #define DIR_LEFT   2
  7. #define DIR_RIGHT  3
  8.  
  9. #define MODE_SINGLE   1
  10. #define MODE_DOUBLE   2
  11.  
  12.  
  13. string DefaultGraphics[4];
  14. string OverwriteGraphic[11];
  15. int    LineMode;
  16.  
  17.  
  18. init()
  19. {
  20.   assign_key("drawline", "<ALT-D>");
  21.  
  22.   DefaultGraphics[DIR_UP+1]    = "││┐┌";
  23.   DefaultGraphics[DIR_DOWN+1]  = "││┘└";
  24.   DefaultGraphics[DIR_LEFT+1]  = "└┌──";
  25.   DefaultGraphics[DIR_RIGHT+1] = "┘┐──";
  26.  
  27.   OverwriteGraphic[1]  = "┼┬┬┬┴┼┴┴┴┬──┴┬──";
  28.   OverwriteGraphic[2]  = "││┤├││┤├├├┼├┤┤┤┼";
  29.   OverwriteGraphic[3]  = "├┌┬┌├├┬├├┌├┌┼┬┬┬";
  30.   OverwriteGraphic[4]  = "┼┬┬┬┼┼┼┼┼┬┬┬┼┬┬┬";
  31.   OverwriteGraphic[5]  = "┤┐┐┬┤┤┤┬┼┬┬┬┤┐┐┬";
  32.   OverwriteGraphic[6]  = "├├┼├├├┼├├├┼├┼┼┼┼";
  33.   OverwriteGraphic[7]  = "┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼";
  34.   OverwriteGraphic[8]  = "┤┤┤┼┤┤┤┼┼┼┼┼┤┤┤┼";
  35.   OverwriteGraphic[9]  = "├├┼├└├┴└└├┴└┴┼┴┴";
  36.   OverwriteGraphic[10] = "┼┼┼┼┴┼┴┴┴┼┴┴┴┼┴┴";
  37.   OverwriteGraphic[11] = "┤┤┤┼┘┤┘┴┴┼┴┴┘┤┘┴";
  38.  
  39.   LineMode = MODE_SINGLE;
  40. }
  41.  
  42.  
  43. drawline()
  44. {
  45.   int  iOldDirection, iNewDirection;
  46.  
  47.   iOldDirection = ERR;
  48.   setprompt(2);
  49.   debug = 1;
  50.  
  51.   while (1)
  52.   {
  53. start:
  54.     if (LineMode == MODE_SINGLE)
  55.       szMode = "Single";
  56.     else if (LineMode == MODE_DOUBLE)
  57.       szMode = "Double";
  58.  
  59.     message("%s-line drawing mode...", szMode);
  60.     s = "";
  61.  
  62.     key = get_tty_char();
  63.     switch (key)
  64.     {
  65.       case _UP :
  66.         iNewDirection = DIR_UP;
  67.         break;
  68.       case _DOWN :
  69.         iNewDirection = DIR_DOWN;
  70.         break;
  71.       case _LEFT :
  72.         iNewDirection = DIR_LEFT;
  73.         break;
  74.       case _RIGHT:
  75.         iNewDirection = DIR_RIGHT;
  76.         break;
  77.       case '1'   :
  78.         LineMode = MODE_SINGLE;
  79. /*      continue; */
  80.         goto start;
  81.       case '2'   :
  82.         LineMode = MODE_DOUBLE;
  83. /*      continue; */
  84.         goto start;
  85.       case ESC   :
  86.         get_tty_str("Thanks for coming!");
  87.         return;
  88.       default :
  89.         bell();
  90. /*      continue; */
  91.         goto start;
  92.     }
  93.  
  94.     /*
  95.       See if the character overwritten is another line graphic character
  96.     */
  97.     if ((chCurrGraphic = index("─│┌┬┐├┼┤└┴┘═║╔╦╗╠╬╣╚╩╝", chr(currchar()))) >= 1)
  98.     {
  99.       chCurrGraphic = (chCurrGraphic / 12) + (chCurrGraphic % 12);
  100.  
  101.       if (debug)
  102.         get_tty_str("chCurrGraphic is [%d]", chCurrGraphic);
  103.  
  104.       if ((s = MaybeCorner(iOldDirection, iNewDirection)) == "")
  105.       {
  106.         s = OverwriteGraphic[chCurrGraphic];
  107.         s = substr(s, iOldDirection*4 + iNewDirection + 1, 1);
  108.       }
  109.     }
  110.  
  111.     else
  112.     {
  113.       /*
  114.         We are not overwriting an existing graphic.
  115.       */
  116.       if (iOldDirection == ERR)
  117.         iOldDirection = iNewDirection;
  118.       szGraphics = DefaultGraphics[iOldDirection+1];
  119.       s = substr(szGraphics, iNewDirection+1, 1);
  120.       if (debug)
  121.         get_tty_str("szGraphics is %s  and s is %s", szGraphics, s);
  122.     }
  123.  
  124.     if (s != "")
  125.     {
  126.       if (currchar())
  127.         delchar();
  128.       insert(GraphicTranslate(tonum(s)));
  129.       refresh();
  130.     }
  131.  
  132.     switch (key)
  133.     {
  134.       case _UP :
  135.         col = currcol()-1;
  136.         up();
  137.         setcol(col);
  138.         break;
  139.       case _DOWN :
  140.         col = currcol()-1;
  141.         if (currlinenum() == lastlinenum())
  142.           append_line();
  143.         else
  144.           down();
  145.         setcol(col);
  146.         break;
  147.       case _LEFT :
  148.         left();
  149.         if (currcol() > 1)
  150.           left();
  151.         break;
  152.       case _RIGHT :
  153.         break;
  154.       default    :
  155. /*      continue; */
  156.         goto start;
  157.     }
  158.  
  159.     iOldDirection = iNewDirection;
  160.  
  161.   } /* end while */
  162. }
  163.  
  164.  
  165. MaybeCorner(iOld, iNew)
  166. {
  167.   chAbove = chBelow = chRight = chLeft = 0;
  168.  
  169.   if (up())
  170.   {
  171.     chAbove = currchar();
  172.     down();
  173.   }
  174.   if (down())
  175.   {
  176.     chBelow = currchar();
  177.     up();
  178.   }
  179.   if (currcol() > 1)
  180.   {
  181.     left();
  182.     chLeft = currchar();
  183.     right();
  184.   }
  185.   right();
  186.   chRight = currchar();
  187.   left();
  188.  
  189.  
  190.   dir = iOld * 4 + iNew;
  191.  
  192.   if (dir == 2 || dir == 13)
  193.   {
  194.     /* UP and LEFT or RIGHT and DOWN */
  195.     if (chAbove == 0 && chRight == 0)
  196.       return "┐";
  197.   }
  198.   else if (dir == 3 || dir == 9)
  199.   {
  200.     /* UP and RIGHT or LEFT and DOWN */
  201.     if (chAbove == 0 && chLeft == 0)
  202.       return "┌";
  203.   }
  204.   else if (dir == 6 || dir == 12)
  205.   {
  206.     /* DOWN and LEFT or RIGHT and UP */
  207.     if (chBelow == 0 && chRight == 0)
  208.       return "┘";
  209.   }
  210.   else if (dir == 7 || dir == 8)
  211.   {
  212.     /* DOWN and RIGHT or LEFT and UP */
  213.     if (chBelow == 0 && chLeft == 0)
  214.       return "└";
  215.   }
  216.  
  217.   return "";
  218. }
  219.  
  220.  
  221. GraphicTranslate(chGraphic)
  222. {
  223.   switch (chGraphic)
  224.   {
  225.     case '─':
  226.       return substr("─═", LineMode, 1);
  227.     case '│':
  228.       return substr("│║", LineMode, 1);
  229.     case '┌':
  230.       return substr("┌╔", LineMode, 1);
  231.     case '┬':
  232.       return substr("┬╦", LineMode, 1);
  233.     case '┐':
  234.       return substr("┐╗", LineMode, 1);
  235.     case '├':
  236.       return substr("├╠", LineMode, 1);
  237.     case '┼':
  238.       return substr("┼╬", LineMode, 1);
  239.     case '┤':
  240.       return substr("┤╣", LineMode, 1);
  241.     case '└':
  242.       return substr("└╚", LineMode, 1);
  243.     case '┴':
  244.       return substr("┴╩", LineMode, 1);
  245.     case '┘':
  246.       return substr("┘╝", LineMode, 1);
  247.   }
  248. }
  249.