home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / s1 / sss / !SSS / c / SSS < prev   
Text File  |  1991-07-30  |  15KB  |  537 lines

  1. /* SSS IconBar handler
  2.    Tue,30 Jul 1991
  3.    Copyright C.T.Stretch 1991
  4. */
  5.  
  6. #include "ssshdr.h"
  7. #include "drhdr.h"
  8. #include "akbd.h"
  9.  
  10. #define HOMEKEY 30
  11. #define PROGNAME "SSS"
  12. #define NONULL wimp_EMNULL
  13. #define PRWIDTH 2
  14. #define PRSEP 4
  15. #define PRREP 6
  16. #define PRMONO 9
  17. #define PRA4P 11
  18. #define PRREAD 14
  19.  
  20. static wimp_w bwind;
  21. static menu barmenu,wmenu;
  22. static dbox edbox;
  23. static int dx=0,dy=1;
  24.  
  25. static void setext()
  26. { int i,w=0;
  27.   wimp_redrawstr r;
  28.   wimp_wstate ws;
  29.   wimp_close_wind(swind);
  30.   r.w=swind;
  31.   r.box.x0=0;
  32.   for(i=0;i<ncols;i++) w+=width[i];
  33.   dispwidth=w*CHWIDTH;
  34.   r.box.x1=dispwidth;
  35.   r.box.y1=0;
  36.   r.box.y0=-LINEHT*nrows;
  37.   wimpt_noerr(wimp_set_extent(&r));
  38.   wimp_get_wind_state(swind,&ws);
  39.   wimpt_noerr(wimp_open_wind(&(ws.o)));
  40. }
  41.  
  42. static void fred()
  43. { wimp_wstate ws;
  44.   wimp_get_wind_state(swind,&ws);
  45.   ws.o.box.x0=0;
  46.   ws.o.box.y1=0;
  47.   ws.o.box.x1=dispwidth;
  48.   ws.o.box.y0=-LINEHT*nrows;
  49.   wimp_force_redraw((wimp_redrawstr*)&(ws.o));
  50. }
  51.  
  52. static void showentry()
  53. { entry **cb=sheet+sx0+sy0*NCOLS;
  54.   char tstr[64];
  55.   int t;
  56.   wimp_caretstr cs;
  57.   for(t=ICSTRING;t<ICRIGHT;t++) dbox_setnumeric(edbox,t,0);
  58.   if(*cb)
  59.   { t=(*cb)->t;
  60.     dbox_setnumeric(edbox,ICSTRING+t,1);
  61.     dbox_setfield(edbox,ICWRITE,&((*cb)->c));
  62.   }
  63.   else
  64.   { t=FINT;
  65.     if(sy0>0)
  66.     { cb=sheet+sx0+(sy0-1)*NCOLS;
  67.       if(*cb) t=(*cb)->t;
  68.     }
  69.     dbox_setnumeric(edbox,ICSTRING+t,1);
  70.     dbox_setfield(edbox,ICWRITE,"");
  71.   }
  72.   ex0=sx0;ex1=sx1;ey0=sy0;ey1=sy1;
  73.   if(sx0==sx1&&sy0==sy1) sprintf(tstr,"Edit [%d,%d]",sx0,sy0);
  74.   else sprintf(tstr,"Edit [%d,%d][%d,%d]",sx0,sy0,sx1,sy1);
  75.   sheet_ebox();
  76.   win_settitle(bwind,tstr);
  77.   dbox_showstatic(edbox);
  78.   cs.w=bwind;
  79.   cs.i=ICWRITE;
  80.   cs.x=-1;cs.y=-1;
  81.   cs.height=-1;
  82.   cs.index=0;
  83.   wimpt_noerr(wimp_set_caret_pos(&cs));
  84. }
  85.  
  86. static void showprev()
  87. { entry **cb=sheet+sx0+sy0*NCOLS;
  88.   int t;
  89.   for(t=ICSTRING;t<ICRIGHT;t++) dbox_setnumeric(edbox,t,0);
  90.   if(*cb)
  91.   { t=(*cb)->t;
  92.     dbox_setnumeric(edbox,ICSTRING+t,1);
  93.     dbox_setfield(edbox,ICWRITE,&((*cb)->c));
  94.   }
  95.   else
  96.   { dbox_setnumeric(edbox,ICSTRING+FINT,1);
  97.     dbox_setfield(edbox,ICWRITE,"");
  98.   }
  99.   sx0=ex0;sx1=ex1;sy0=ey0;sy1=ey1;
  100.   sheet_box();
  101. }
  102.  
  103. static void mouse(wimp_mousestr *m)
  104. { int bx,by,x;
  105.   wimp_wstate state;
  106.   wimpt_noerr(wimp_get_wind_state(swind,&state));
  107.   bx=state.o.box.x0-state.o.x;
  108.   by=state.o.box.y1-state.o.y;
  109.   switch(m->bbits)
  110.   { case wimp_BLEFT:x=(m->x-bx+8)/CHWIDTH;
  111.                     for(sx0=0;((x-=width[sx0])>0)&&(sx0<ncols-1);sx0++);
  112.                     sy0=(by-m->y)/LINEHT;
  113.                     if(sy0>=nrows) sy0=nrows-1;
  114.                     sx1=sx0;sy1=sy0;
  115.                     sheet_box();
  116.                     break;
  117.     case wimp_BRIGHT:x=(m->x-bx+8)/CHWIDTH;
  118.                     for(sx1=0;((x-=width[sx1])>0)&&(sx1<ncols-1);sx1++);
  119.                     sy1=(by-m->y)/LINEHT;
  120.                     if(sy1>=nrows)sy1=nrows-1;
  121.                     if(sx0>sx1) {x=sx0;sx0=sx1;sx1=x;}
  122.                     if(sy0>sy1) {x=sy0;sy0=sy1;sy1=x;}
  123.                     sheet_box();
  124.                     break;
  125.   }
  126. }
  127.  
  128. static void openedit()
  129. { dbox_hide(edbox);
  130.   showentry();
  131. }
  132.  
  133. static void barclick(wimp_i i)
  134. { wimp_wstate ws;
  135.   i=i;
  136.   setext();
  137.   wimp_get_wind_state(swind,&ws);
  138.   ws.o.behind=-1;
  139.   wimpt_noerr(wimp_open_wind(&(ws.o)));
  140.   openedit();
  141. }
  142.  
  143. static void display(wimp_redrawstr *r)
  144. { int bx,by,more,tl,bl,l,i,x1,x2;
  145.   entry *ce;
  146.   char num[256];
  147.   wimpt_noerr(wimp_redraw_wind(r,&more));
  148.   bx=r->box.x0-r->scx;
  149.   by=r->box.y1-r->scy;
  150.   while(more)
  151.   { wimp_setcolour(7);
  152.     tl=(by-r->g.y1)/LINEHT;
  153.     if(tl<0) tl=0;
  154.     bl=(by-r->g.y0)/LINEHT;
  155.     if(bl>=nrows) bl=nrows-1;
  156.     for(l=tl;l<=bl;l++)
  157.     { bbc_move(r->g.x0,by-LINEHT*l);
  158.       bbc_draw(r->g.x1,by-LINEHT*l);
  159.     }
  160.     x1=bx;
  161.     for(i=0;i<ncols;i++) if(width[i])
  162.     { x2=x1+width[i]*CHWIDTH;
  163.       if(x1>r->g.x1) break;
  164.       if(x2>=r->g.x0)
  165.       { bbc_move(x2,r->g.y0);
  166.         bbc_draw(x2,r->g.y1);
  167.       }
  168.       if(x2>r->g.x0) for(l=tl;l<=bl;l++)
  169.       { ce=sheet[i+l*NCOLS];
  170.         if(ce)
  171.         { bbc_move(x1+XOFF,by-LINEHT*l-YOFF);
  172.           if(ce->p) printf("%.*s",width[i]-1,"P???????");
  173.           else
  174.           { if(ce->a) printf("%.*s",width[i]-1,"A!!!!!!!");
  175.             else switch(ce->t)
  176.             { case FSTRING:
  177.               case FLONG:printf("%.*s",width[i]-1,&(ce->c));break;
  178.               case FINT:sprintf(num,"%.0f",ce->v);
  179.                         printf("%.*s",width[i]-1,num);break;
  180.               case F2DP:sprintf(num,"%.2f",ce->v);
  181.                         printf("%.*s",width[i]-1,num);break;
  182.               case F4DP:sprintf(num,"%.4f",ce->v);
  183.                         printf("%.*s",width[i]-1,num);break;
  184.               case FEXP:sprintf(num,"%.4e",ce->v);
  185.                         printf("%.*s",width[i]-1,num);break;
  186.             }
  187.           }
  188.         }
  189.       }
  190.       x1=x2;
  191.     }
  192.     wimp_setcolour(15+16*3);
  193.     bbc_rectanglefill(bx+bx0,by-by1,bw,bh);
  194.     bbc_rectanglefill(bx+bx0+8,by-by1+8,bw-16,bh-16);
  195.     wimp_setcolour(12+16*3);
  196.     bbc_rectanglefill(bx+ebx0,by-eby1,ebw,ebh);
  197.     wimp_get_rectangle(r,&more);
  198.   }
  199. }
  200.  
  201. static void update()
  202. { if(uy>=nrows)
  203.   { uy=0;
  204.     if(changed) fred();
  205.     if(!autox||!changed)
  206.     { event_setmask(NONULL);
  207.       return;
  208.     }
  209.     changed=FALSE;
  210.   }
  211.   sheet_update();
  212.   uy++;
  213. }
  214.  
  215. static void handler(wimp_eventstr *e,void *v)
  216. { v=v;
  217.   switch(e->e)
  218.   { case wimp_ENULL  :update();break;
  219.     case wimp_EREDRAW:display((wimp_redrawstr*)(&(e->data.o)));break;
  220.     case wimp_EOPEN  :wimpt_noerr(wimp_open_wind(&(e->data.o)));break;
  221.     case wimp_ECLOSE :wimpt_noerr(wimp_close_wind(e->data.o.w));break;
  222.     case wimp_EBUT   :mouse(&(e->data.but.m));break;
  223.     case wimp_ESEND:case wimp_ESENDWANTACK:
  224.               switch (e->data.msg.hdr.action)
  225.               { case wimp_MDATALOAD:io_merge();setext();break;
  226.               }
  227.               break;
  228.   }
  229. }
  230.  
  231. static void getdirn()
  232. { if(dbox_getnumeric(edbox,ICRIGHT))
  233.   { dx=1;dy=0;return;
  234.   }
  235.   dx=0;dy=1;
  236. }
  237.  
  238. static void getnext()
  239. { getdirn();
  240.   if(ex0==ex1)
  241.   { sx0=ex0+dx;
  242.     if(sx0>=ncols) sx0=ncols-1;
  243.     sx1=sx0;
  244.   }
  245.   else
  246.   { sx0=ex0;sx1=ex1;
  247.   }
  248.   if(ey0==ey1)
  249.   { sy0=ey0+dy;
  250.     if(sy0>=nrows) sy0=nrows-1;
  251.     sy1=sy0;
  252.   }
  253.   else
  254.   { sy0=ey0;sy1=ey1;
  255.   }
  256.   sheet_box();
  257.   showentry();
  258. }
  259.  
  260. static void insrange(BOOL rel)
  261. { wimp_caretstr cs;
  262.   int n;
  263.   char buf2[BUFLEN];
  264.   wimp_get_caret_pos(&cs);
  265.   if(cs.w!=bwind) werr(0,"window %d",cs.w);
  266.   n=cs.index;
  267.   dbox_getfield(edbox,ICWRITE,buf,BUFLEN);
  268.   if(strlen(buf)+27>=BUFLEN) return;
  269.   if(sx0==sx1&&sy0==sy1)
  270.   { if(rel) sprintf(buf2,"%.*s[x%+d,y%+d]%s",n,buf,sx0-ex0,sy0-ey0,buf+n);
  271.     else
  272.         sprintf(buf2,"%.*s[%d,%d]%s",n,buf,sx0,sy0,buf+n);
  273.   }
  274.   else
  275.   { if(rel)
  276.     { sprintf(buf2,"%.*s[x%+d,y%+d][x%+d,y%+d]%s",
  277.             n,buf,sx0-ex0,sy0-ey0,sx1-ex0,sy1-ey0,buf+n);
  278.     }
  279.     else
  280.         sprintf(buf2,"%.*s[%d,%d][%d,%d]%s",
  281.         n,buf,sx0,sy0,sx1,sy1,buf+n);
  282.   }
  283.   dbox_setfield(edbox,ICWRITE,buf2);
  284.   cs.index+=strlen(buf2)-strlen(buf);
  285.   wimpt_noerr(wimp_set_caret_pos(&cs));
  286. }
  287.  
  288. static void edhandler(dbox d,void *h)
  289. { dbox_field f=dbox_get(d);
  290.   int x,y,t;
  291.   entry *cb;
  292.   h=h;
  293.   switch (f)
  294.   { case dbox_CLOSE:dbox_hide(d);break;
  295.     case ICOK:dbox_getfield(d,ICWRITE,buf,256);
  296.            for(t=0;t<FEXP;t++) if(dbox_getnumeric(edbox,ICSTRING+t)) break;
  297.            for(x=ex0;x<=ex1;x++) if(width[x])
  298.              for(y=ey0;y<=ey1;y++) sheet_getentry(x,y,t);
  299.            fred();
  300.            getnext();
  301.            if(autox) sheet_change();
  302.            break;
  303.     case ICEDIT:showentry();break;
  304.     case ICFORMAT:
  305.            for(t=0;t<FEXP;t++) if(dbox_getnumeric(edbox,ICSTRING+t)) break;
  306.            if(t<FINT) break;
  307.            for(x=ex0;x<=ex1;x++) for(y=ey0;y<=ey1;y++)
  308.            { cb=sheet[x+y*NCOLS];
  309.              if(cb&&cb->t>=FINT) cb->t=t;
  310.            }
  311.            fred();break;
  312.     case ICNEXT:getnext();break;
  313.     case ICCANCEL:showprev();break;
  314.     case ICABS:insrange(0);break;
  315.     case ICREL:insrange(1);break;
  316.     default:break;
  317.   }
  318. }
  319.  
  320. static BOOL edkeys(dbox d,void *e,void *h)
  321. { wimp_wstate state;
  322.   h=h;d=d;
  323.   if(((wimp_eventstr*)e)->e!=wimp_EKEY) return FALSE;
  324.   switch(((wimp_eventstr*)e)->data.key.chcode)
  325.   { case HOMEKEY:if(akbd_pollsh())
  326.                  { s