home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 6 / FreshFish_September1994.bin / bbs / misc / cp-4.3.lha / cP / Source / drawview.c < prev    next >
C/C++ Source or Header  |  1994-08-03  |  32KB  |  1,400 lines

  1. #include "cp.h"
  2.  
  3. #define SIZETIC  5  /* size major tik in pixels */
  4. #define BOXOFF   10  /* add to filename box size */
  5. #define TIKCOLOR 2  /* color for tiks */
  6. #define BORDER   20 /* size between filename boxes */
  7.  
  8. struct RastPort *rp;
  9. struct ViewPort *vp;
  10.  
  11. struct World wd;
  12. struct CurView cv;
  13. struct CurView ov;
  14.  
  15. WORD WIDTH;
  16. WORD HEIGHT;
  17. WORD OFFSET;
  18.  
  19. WORD xoff;
  20. WORD yoff;
  21.  
  22. LONG precision = 2L;
  23.  
  24. /* Draw everything if full is TRUE autoscale */
  25.  
  26. void DrawView ( BOOL full )
  27. {
  28.  
  29.       vp = &(Scr-> ViewPort); /* Always reinit since could be new screen */
  30.       rp = PlotWindowWnd-> RPort;
  31.  
  32.     if (cv.xmin>=cv.xmax||cv.ymin>=cv.ymax)    FindWorld ();
  33.  
  34.      if( !(IsListEmpty(SetList)))
  35.        {
  36.  
  37.           if( full ) FindWorld ();
  38.     
  39.         if (! HandlePlotWindowIDCMP()) Death(0);
  40.  
  41.           SetAPen(rp,1);
  42.  
  43.           OFFSET = rp->Font->tf_YSize + 2 * BORDER + Scr-> BarHeight;
  44.           HEIGHT = PlotWindowWnd-> Height - OFFSET - ( CPANEL ? 4 : 3 ) * GADHEIGHT;
  45.  
  46.           yoff = OFFSET + HEIGHT;
  47.  
  48.           xoff = rp-> Font-> tf_XSize * 6 + BORDER + SIZETIC;
  49.  
  50.           DrawFileNameBoxes( yoff - HEIGHT);
  51.  
  52.           if ( WIDTH < BORDER || HEIGHT < BORDER ) Death(20);
  53.  
  54.           DrawColorBox( xoff , yoff, WIDTH, HEIGHT, 14);
  55.  
  56.           XAxis();
  57.           YAxis();
  58.           LabelTitle();
  59.           
  60.           DrawAllSets ();
  61.  
  62.           if ( sym ) SymAllSets();
  63.           if ( grid ) Grid();
  64.        }
  65.      else
  66.          Erase( TRUE );
  67.          
  68. }
  69.  
  70. /* Draw all sets in SetList */
  71.  
  72. void DrawAllSets ()
  73. {
  74. WORD p = 4;
  75. struct Set *node;
  76.  
  77.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  78.        {
  79.  
  80.           SetAPen(rp,min(p,lastcolor));
  81.  
  82.           DrawSet ( node-> FirstPoint );
  83.  
  84.           p++;
  85.  
  86.           if ( p > lastcolor - 2 ) p = 4;
  87.  
  88.              if(! HandlePlotWindowIDCMP())    Death(5);
  89.  
  90.        }
  91. }
  92.  
  93. /* Draw symbols on all sets */
  94.  
  95. void SymAllSets ()
  96. {
  97. struct Set *node;
  98.  
  99.      SetDrMd( rp, JAM2);
  100.  
  101.      if (depth > 2)
  102.           SetAPen(rp,15);
  103.      else
  104.           SetAPen(rp,1);
  105.  
  106.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  107.        {
  108.  
  109.           SymSet ( node-> FirstPoint );
  110.  
  111.              if(! HandlePlotWindowIDCMP())    Death(5);
  112.  
  113.        }
  114. }
  115.  
  116. /* Adjust view so all data sets show */
  117.  
  118. void FindWorld ()
  119. {
  120. struct Set *node;
  121.  
  122.      node = (struct Set *)SetList-> lh_Head;
  123.  
  124.      wd.xmax = node-> xmax;
  125.      wd.xmin = node-> xmin;
  126.      wd.ymax = node-> ymax;
  127.      wd.ymin = node-> ymin;
  128.  
  129.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  130.        {
  131.  
  132.           wd.xmax = max( wd.xmax, node-> xmax);
  133.           wd.xmin = min( wd.xmin, node-> xmin);
  134.           wd.ymax = max( wd.ymax, node-> ymax);
  135.           wd.ymin = min( wd.ymin, node-> ymin);
  136.  
  137.        }
  138.  
  139.      ov.xmax = cv.xmax = wd.xmax;
  140.      ov.xmin = cv.xmin = wd.xmin;
  141.      ov.ymax = cv.ymax = wd.ymax;
  142.      ov.ymin = cv.ymin = wd.ymin;
  143.  
  144.      wd.xdelta = wd.xmax - wd.xmin;
  145.      wd.ydelta = wd.ymax - wd.ymin;
  146.  
  147.      ov.xdelta = cv.xdelta = wd.xdelta;
  148.      ov.ydelta = cv.ydelta = wd.ydelta;
  149. }
  150.  
  151. /* Draw one set */
  152.  
  153. void DrawSet ( struct Point *ThisPoint )
  154. {
  155. LONG qx, qy;
  156. LONG le, te, re, be;
  157.  
  158. struct Rectangle rect;
  159. struct Region *new_region;
  160. struct Region *old_region;
  161.  
  162.      rect.MinX = xoff;
  163.      rect.MaxX = xoff + WIDTH;
  164.      rect.MinY = yoff - HEIGHT;
  165.      rect.MaxY = yoff;
  166.  
  167.      le = PlotWindowWnd-> LeftEdge;
  168.      te = PlotWindowWnd-> TopEdge;
  169.      re = PlotWindowWnd-> LeftEdge + PlotWindowWnd-> Width;
  170.      be = PlotWindowWnd-> TopEdge + PlotWindowWnd-> Height;
  171.  
  172.      if ( ! (new_region = NewRegion())) return;
  173.  
  174.      if ( ! (OrRectRegion( new_region, &rect))) return;
  175.  
  176.      if (( old_region = InstallClipRegion( PlotWindowWnd-> WLayer, new_region ))) return;
  177.  
  178.      qx = ScaleX( ThisPoint-> xval);
  179.      qy = ScaleY( ThisPoint-> yval);
  180.  
  181.      if ( qx < le ) qx = le;
  182.      if ( qx > re ) qx = re;
  183.      if ( qy < te ) qy = te;
  184.      if ( qy > be ) qy = be;
  185.  
  186.      Move ( rp, qx, qy );
  187.  
  188.      do
  189.        {
  190.  
  191.           ThisPoint = ThisPoint-> NextPoint;
  192.  
  193.           qx = ScaleX( ThisPoint-> xval);
  194.  
  195.           /* need to change if not time sampled data */
  196.           if ( qx < le ) continue;
  197.           if ( qx > re && RealTime ) break;
  198.  
  199.           qy = ScaleY( ThisPoint-> yval);
  200.  
  201.           if ( qy < te ) qy = te;
  202.           if ( qy > be ) qy = be;
  203.  
  204.           Draw ( rp, qx, qy);
  205.  
  206.        } while ( ThisPoint-> NextPoint );
  207.  
  208.      new_region = InstallClipRegion(PlotWindowWnd->WLayer, old_region);
  209.  
  210.      DisposeRegion(new_region);
  211. }
  212.  
  213. /* draw symbols on one set */
  214.  
  215. void SymSet ( struct Point *ThisPoint )
  216. {
  217. LONG qx, qy;
  218. WORD dx, dy;
  219. BOOL clip;
  220.  
  221.      dx = xoff + WIDTH;
  222.      dy = yoff - HEIGHT;
  223.  
  224.      do {
  225.  
  226.  
  227.           clip = FALSE;
  228.  
  229.           qx = ScaleX( ThisPoint-> xval);
  230.           qy = ScaleY( ThisPoint-> yval);
  231.  
  232.           if ( qx < xoff )
  233.             {
  234.                qx = xoff;
  235.                clip = TRUE;
  236.             }
  237.           else if ( qx > dx )
  238.             {
  239.                qx = dx;
  240.                clip = TRUE;
  241.             }
  242.           if ( qy > yoff )
  243.             {
  244.                qy = yoff;
  245.                clip = TRUE;
  246.             }
  247.           else if ( qy < dy )
  248.             {
  249.                qy = dy;
  250.                clip = TRUE;
  251.             }
  252.  
  253.           if ( !clip )
  254.             {
  255.                Move ( rp, qx - 1, qy + 1);
  256.                Draw ( rp, qx + 1, qy - 1);
  257.                Move ( rp, qx + 1, qy + 1);
  258.                Draw ( rp, qx - 1, qy - 1);
  259.             }
  260.  
  261.           ThisPoint = ThisPoint-> NextPoint;
  262.  
  263.      } while ( ThisPoint );
  264. }
  265.  
  266. /* Draw recessed bevel box filled with color */
  267.  
  268. void DrawColorBox ( WORD xs ,WORD ys , WORD xw ,WORD yh, WORD color)
  269. {
  270.  
  271.      SetAPen( rp, (MONO ? 0 : color));
  272.  
  273.      RectFill( rp, xs, ys - yh - 1, xs + xw, ys + 1 );
  274.  
  275.      DrawBevelBox( rp, xs - 2, ys - yh - 1 , xw + 5, yh + 4, GT_VisualInfo, VisualInfo, GTBB_Recessed, TRUE, TAG_DONE);
  276. }
  277.  
  278.  
  279. /* Draw Color boxes with filenames in them */
  280.  
  281. WORD DrawFileNameBoxes( WORD ys)
  282. {
  283. struct Set *node;
  284. struct TextExtent txex;
  285. WORD p = 4, h = 0, w = 0, xs, ns = 0;
  286.  
  287.  
  288.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  289.        {
  290.           TextExtent( rp, node-> fn, strlen( node-> fn ), &txex);
  291.  
  292.           w = max( w, txex.te_Width);
  293.           h = max( h, txex.te_Height);
  294.  
  295.           ns++;
  296.        }
  297.  
  298.      w += BOXOFF;
  299.      h += BOXOFF;
  300.  
  301.      SetBPen( rp, 1);
  302.  
  303.      if ( ns > 1 )
  304.           xs = PlotWindowWnd-> Width - w - BORDER;
  305.      else
  306.        {
  307.           xs = ( PlotWindowWnd-> Width / 2 - w / 2);
  308.           ys = (WORD)(txex.te_Height * 1.5);
  309.        }
  310.  
  311.      WIDTH = PlotWindowWnd-> Width - (ns > 1 ? w + 2 * BORDER : xoff) - xoff; /* if only one set fnbox on top so width = windowwidth - 2*xoff */
  312.  
  313.     Erase(FALSE); /* need to erase before drawing fnboxes but could not get calc width till now */
  314.     
  315.     if (NOFNAME) /* if not drawing filename boxes set box symetrical and return */
  316.       {
  317.           WIDTH = PlotWindowWnd-> Width - ( 2 * xoff);
  318.           return((WORD)xoff);
  319.       }
  320.  
  321.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  322.        {
  323.           SetAPen( rp, p);
  324.  
  325.           ys += h;
  326.  
  327.           TextExtent( rp, node-> fn, strlen( node-> fn ), &txex);
  328.  
  329.           if ( MONO == FALSE ) DrawColorBox( xs , ys, w, h, p );
  330.  
  331.           SetDrMd( rp, (JAM2 | INVERSVID));
  332.  
  333.           Move ( rp, xs + w/2 - txex.te_Width/2 , ys - BOXOFF / 2 );
  334.           Text( rp, node-> fn, strlen( node-> fn));
  335.  
  336.           ys += BORDER;
  337.  
  338.           SetDrMd( rp, JAM2);
  339.  
  340.           p++;
  341.           if ( p > lastcolor - 2 ) p = 4;
  342.        }
  343.  
  344.      return (WORD)( ns > 1 ? w + 2 * BORDER : xoff ); /* return no longer used for anything */
  345. }
  346.  
  347. /* Adjust xmin and xmax to even nubers and draw tiks with text */
  348.  
  349. void XAxis()
  350. {
  351.      LOGX ? logXAxis() : linXAxis();
  352. }
  353.  
  354. /* Adjust ymin and ymax to even nubers and draw tiks with text */
  355.  
  356. void YAxis()
  357. {
  358.      LOGY ? logYAxis() : linYAxis();
  359. }
  360.  
  361. void logXAxis()
  362. {
  363. LONG j, k, l;
  364. double q, r;
  365. struct TextExtent txex;
  366.  
  367.      /* Cant do negative log scale set lin */
  368.  
  369.      if( cv.xmin <= 0.0 )
  370.        {
  371.           SetWindowTitles( PlotWindowWnd, NULL, "Cant do