Annotation of researchv9/jtools/src/cip/menus.c, revision 1.1

1.1     ! root        1: /*
        !             2:   %Z%  %M%  version %I% %Q%of %H% %T%
        !             3:   Last Delta:  %G% %U% to %P%
        !             4: */
        !             5: 
        !             6: #include "cip.h"
        !             7: 
        !             8: 
        !             9: extern int currentBrush, copyFlag, thingSelected, editDepth;
        !            10: extern Rectangle brushes[];
        !            11: extern int gridState, videoState, buttonState;
        !            12: extern short noSpace;
        !            13: extern Point jString ();
        !            14: extern void getKbdChar ();
        !            15: extern void jMoveTo ();
        !            16: extern struct macro *macroList;
        !            17: 
        !            18: char *lineText[] = {"delete","copy",
        !            19:         "solid","dotted","dashed","arrow",
        !            20:         "reflect x","reflect y",NULL};
        !            21: Menu lineMenu = { lineText };
        !            22: 
        !            23: char *boxText[] = {"delete","copy","solid","dotted","dashed",NULL};
        !            24: Menu boxMenu = { boxText };
        !            25: 
        !            26: char *circleText[] = {"delete","copy",NULL};
        !            27: Menu circleMenu = { circleText };
        !            28: 
        !            29: char *splineText[] = {"delete", "copy", "arrow",
        !            30:                      "reflect x", "reflect y", NULL};
        !            31: Menu splineMenu = { splineText };
        !            32: 
        !            33: char *arcText[] = {"delete","copy","reflect x","reflect y",NULL};
        !            34: Menu arcMenu = { arcText };
        !            35: 
        !            36: char *macroText[] = {"delete","copy","reflect x","reflect y",
        !            37:                      "edit","separate",NULL};
        !            38: Menu macroMenu = { macroText };
        !            39: 
        !            40: char *textText[] = {"delete","copy","point size","roman",
        !            41:                     "italic","bold", "center","left justify",
        !            42:                    "right justify","attributes",
        !            43:                     NULL};
        !            44: Menu textMenu = { textText };
        !            45: 
        !            46: #define GET 0
        !            47: #define PUT 1
        !            48: #define CLEAR 2
        !            49: #define REDRAW 3
        !            50: #define DEFINEMACRO 4
        !            51: #define GRID 5
        !            52: #define FLIPVIDEO 6
        !            53: #define QUIT 7
        !            54: #define DUMPIT 8
        !            55: 
        !            56: char *commandText[] = {"get file","put file","clear screen", 
        !            57:                       "redraw screen","define macro","grid",
        !            58:                       "reverse video","quit",
        !            59: #ifdef DUMP
        !            60:                       "dump",
        !            61: #endif
        !            62:                       NULL};
        !            63: Menu commandMenu = { commandText };
        !            64: 
        !            65: int
        !            66: menuHit (menu, but)
        !            67: Menu *menu;
        !            68: int but;
        !            69: {
        !            70:   int item;
        !            71: 
        !            72:   cursswitch ((Word *)NULL);
        !            73:   item = menuhit(menu, but);
        !            74:   cursSwitch ();
        !            75:   return (item);
        !            76: }
        !            77: 
        !            78: struct thing *
        !            79: insertReflect (t, p, item, which)
        !            80: struct thing *t;
        !            81: Point p;               /* Offset */
        !            82: int item;
        !            83: int which;             /* Which item to be tested */
        !            84: {
        !            85:   register struct thing d;     /* Dummy structure */
        !            86:   register struct thing *h;    /* New head of thing list */
        !            87: 
        !            88:   drawSelectionLines(t,p);
        !            89:   draw(t,p);
        !            90:   h = remove(t);
        !            91:   d = *t;
        !            92:   free(t);                             
        !            93:   h = (item==which) ? 
        !            94:       insert(reflect(&d,Pt(0,d.bb.corner.y+d.bb.origin.y)),h)
        !            95:     : insert(reflect(&d,Pt(d.bb.corner.x+d.bb.origin.x,0)),h);
        !            96:   draw(h,p);
        !            97:   drawSelectionLines(h,p);
        !            98:   return (h);
        !            99: }
        !           100: 
        !           101: /* This routine deletes the given macro from the macro list. */
        !           102: /* It has to scan the macro list looking for that macros entry since */
        !           103: /* there are no back links within the list. */
        !           104: 
        !           105: void
        !           106: removeMacro (m)
        !           107: struct macro *m;
        !           108: {
        !           109:   register struct macro *ml;   /* Pointer for macro list */
        !           110: 
        !           111:   if (m == macroList) {
        !           112:     macroList = (struct macro *)NULL;
        !           113:   }
        !           114:   else {
        !           115:     for (ml = macroList; ml != (struct macro *)NULL; ml = ml->next) {
        !           116:       if (ml->next == m) {     /* Macro found delete it. */
        !           117:        ml->next = m->next;
        !           118:       }
        !           119:     }
        !           120:   }
        !           121:   free (m);
        !           122:   return;
        !           123: }
        !           124: 
        !           125: struct thing *
        !           126: displayThingMenu(m,t,p) 
        !           127: Point m;                       /* Mouse location */
        !           128: Point p;                       /* Offset */
        !           129: register struct thing *t;      /* Thing to be displayed */
        !           130: {
        !           131:   register int item; 
        !           132:   register int i, b, oldED; 
        !           133:   register struct thing *pts;
        !           134:   register struct thing *h, *g, *f; 
        !           135:   Rectangle r; register char c, s[10];
        !           136: 
        !           137:   switch(t->type) {
        !           138:     case LINE: {
        !           139:       item = menuHit (&lineMenu, 3);
        !           140:       b = -1;
        !           141:       switch (item) {
        !           142:        case 2: {
        !           143:          /* make line solid */
        !           144:          b = SOLID;
        !           145:          break;
        !           146:        }
        !           147:        case 3: {
        !           148:          /* make line dotted */
        !           149:          b = DOTTED;
        !           150:          break;
        !           151:        }
        !           152:        case 4: {
        !           153:          /* make line dashed */
        !           154:          b = DASHED;
        !           155:          break;
        !           156:        }
        !           157:        case 5: {
        !           158:          /* add or remove arrowheads */
        !           159:          draw(t,p);
        !           160:          if (distance(m,t->origin) < distance(m,t->otherValues.end)) {
        !           161:            if ((t->arrow==startARROW)||(t->arrow==doubleARROW)) {
        !           162:              t->arrow -= startARROW;
        !           163:            }
        !           164:            else {
        !           165:              t->arrow += startARROW;
        !           166:            }
        !           167:          }
        !           168:          else {
        !           169:            if ((t->arrow==endARROW)||(t->arrow==doubleARROW)) {
        !           170:              t->arrow -= endARROW;
        !           171:            }
        !           172:            else {
        !           173:              t->arrow += endARROW;
        !           174:            }
        !           175:          }
        !           176:          draw(t,p);
        !           177:          break;
        !           178:        }
        !           179:        case 6:
        !           180:        case 7: {
        !           181:          t = insertReflect (t, p, item, 6);
        !           182:          break;
        !           183:        }
        !           184:       }
        !           185:       if (b >= 0 && b!=t->boorder) {
        !           186:        draw(t,p);
        !           187:        t->boorder = b;
        !           188:        draw(t,p);
        !           189:       }
        !           190:       break;
        !           191:     }
        !           192:     case BOX: {
        !           193:       item = menuHit(&boxMenu,3);
        !           194:       b = -1;
        !           195:       switch(item) {
        !           196:        case 2: {       /* make box outline solid */
        !           197:          b = SOLID;
        !           198:          break;
        !           199:        }
        !           200:        case 3: {       /* make box outline dotted */
        !           201:          b = DOTTED;
        !           202:          break;
        !           203:        }
        !           204:        case 4: {       /* make box outline dashed */
        !           205:          b = DASHED;
        !           206:          break;
        !           207:        }
        !           208:       }
        !           209:       if (b>=0 && b!=t->boorder) {
        !           210:        draw(t,p);
        !           211:        t->boorder = b;
        !           212:        draw(t,p);
        !           213:       }
        !           214:       break;
        !           215:     }
        !           216:     case MACRO: {
        !           217:       item = menuHit(&macroMenu,3);
        !           218:       switch (item) {
        !           219:        case 2: 
        !           220:        case 3: {
        !           221:          r = t->otherValues.list->bb;
        !           222:          h = TNULL;
        !           223:          draw(t,p);
        !           224:          if (item==2 && t->otherValues.list->xReflectionOf
        !           225:              != (struct macro *)NULL) {
        !           226:            t->otherValues.list->useCount--;
        !           227:            t->otherValues.list = t->otherValues.list->xReflectionOf;
        !           228:          }
        !           229:          else {
        !           230:            if (item==3 && t->otherValues.list->yReflectionOf
        !           231:                != (struct macro *)NULL) {
        !           232:              t->otherValues.list->useCount--;
        !           233:              t->otherValues.list = t->otherValues.list->yReflectionOf;
        !           234:            }
        !           235:            else {
        !           236:              /* Go thru parts list, reflect all things, and */
        !           237:              /* make copies of them.  The copies go into the list h. */
        !           238:              if ((g=t->otherValues.list->parts)
        !           239:                   !=TNULL) {
        !           240:                do {
        !           241:                  h = (item==2) ? 
        !           242:                      insert(reflect(
        !           243:                      g,Pt(0,r.origin.y+r.corner.y)),h)
        !           244:                      : insert(reflect(
        !           245:                      g,Pt(r.corner.x+r.origin.x,0)),h);
        !           246:                  g = g->next;
        !           247:                } while (g != t->otherValues.list->parts);
        !           248:              }
        !           249:              t->otherValues.list = recordMacro(h,r,
        !           250:                  (item==2)?t->otherValues.list :(struct macro *)NULL,
        !           251:                  (item==2)?(struct macro *)NULL :t->otherValues.list,
        !           252:                  NULL);
        !           253:            }
        !           254:          }
        !           255:          t->otherValues.list->useCount++;
        !           256:          draw(t,p);
        !           257:          break;
        !           258:        }
        !           259:        case 4: {
        !           260:          /* edit macro */
        !           261:          oldED = editDepth;
        !           262:          removeReflectionReferences(t->otherValues.list);
        !           263:          pts = t->otherValues.list->parts;
        !           264:          /* Draw edit button when editDepth==1, other times */
        !           265:          /* undraw button. */
        !           266:          if ((editDepth)!=0) {
        !           267:            drawEDbutton(editDepth);
        !           268:          }
        !           269:          drawEDbutton(++editDepth);
        !           270:          changeButtons (INITbuttons);
        !           271:          thingSelected = 0;
        !           272:          while (editDepth>oldED) {
        !           273:            pts = doMouseButtons(pts,add(p,t->origin));
        !           274:            jnap(2);
        !           275:          }
        !           276:          t->otherValues.list->parts = pts;
        !           277:          t->otherValues.list->bb = macroBB(pts);
        !           278:          if (thingSelected) {
        !           279:            drawSelectionLines (t, p);
        !           280:            thingSelected = 0;
        !           281:          }
        !           282:          if (editDepth==0) {
        !           283:            doRedraw(t, p);
        !           284:          }
        !           285:          break;
        !           286:        }
        !           287:        case 5: {       /* separate */
        !           288:          h = remove(t);        /* Cut macro from thing list */
        !           289:          t->otherValues.list->useCount--;
        !           290:          m = sub(Pt(0,0),t->origin);
        !           291:          /* Go thru macro's thing list and make everything relative */
        !           292:          if ((g=t->otherValues.list->parts)!=TNULL) {
        !           293:            if (t->otherValues.list->useCount > 0) {
        !           294:              do {      /* Copy list */
        !           295:                if ((f=(struct thing *)getSpace(sizeof(struct thing))) 
        !           296:                     == TNULL) {
        !           297:                  break;
        !           298:                }
        !           299:                g = g->next;
        !           300:                *f = *g;
        !           301:                f = makeRelative (f, m);
        !           302:                h = insert (f, h);
        !           303:              } while (g != t->otherValues.list->parts);
        !           304:            }
        !           305:            else {
        !           306:              do{       /* Move list */
        !           307:                g = g->next;
        !           308:                g = makeRelative(g,m);
        !           309:                f = g;
        !           310:                g = remove (f);
        !           311:                h = insert (f, h);
        !           312:              } while (g != TNULL);
        !           313:              removeMacro (t->otherValues.list);
        !           314:            }
        !           315:          }
        !           316: 
        !           317:          thingSelected = 0;
        !           318:          copyFlag = 0;
        !           319:          changeButtons(INITbuttons);
        !           320:          free(t);              /* Remove macro thing */
        !           321:          t = h;
        !           322:          break;
        !           323:        }
        !           324:       }
        !           325:       break;
        !           326:     }
        !           327:     case TEXT: {
        !           328:       item = menuHit(&textMenu,3);
        !           329:       switch (item) {
        !           330:        case 2: {       /* point size */
        !           331:          m = MOUSE_XY;
        !           332:          m.x += 20;
        !           333:          getKbdText (s, m, 0, &pointsize, sizeof (s)-1);
        !           334:          b = atoi (s);
        !           335:          draw(t,p);
        !           336:          t->otherValues.text.f->useCount--;
        !           337:          t->otherValues.text.f = 
        !           338:              findFont(b,t->otherValues.text.f->num);
        !           339:          draw(t,p);
        !           340:          BoundingBox(t);
        !           341:          break;
        !           342:        }
        !           343:        case 3:         /* roman face */
        !           344:        case 4:         /* italic face */
        !           345:        case 5: {       /* bold face */
        !           346:          draw(t,p);
        !           347:          t->otherValues.text.f->useCount--;
        !           348:          t->otherValues.text.f = 
        !           349:              findFont(t->otherValues.text.f->ps,item-2);
        !           350:          BoundingBox(t);
        !           351:          draw(t,p);
        !           352:          break;
        !           353:        }
        !           354:        case 6:         /* center */
        !           355:        case 7:         /* left justify */
        !           356:        case 8: {       /* right justify */
        !           357:          draw(t,p);
        !           358:          t->otherValues.text.just = item - 6;
        !           359:          BoundingBox(t);
        !           360:          draw(t,p);
        !           361:          break;
        !           362:        }
        !           363:        case 9: {       /* show attributes */
        !           364:          char buf[25];
        !           365:          cursswitch(&candle);
        !           366:          sprintf(buf,"%s  f:%c  ps:%d",
        !           367:              (t->otherValues.text.just==CENTER)?"center":
        !           368:              ((t->otherValues.text.just==LEFTJUST)?"ljust":"rjust"),
        !           369:              (t->otherValues.text.f->num==ROMAN)?'R':
        !           370:              ((t->otherValues.text.f->num==ITALIC)?'I':'B'),
        !           371:              t->otherValues.text.f->ps);
        !           372:          m = MOUSE_XY;
        !           373:          jMoveTo(Pt(m.x+20,m.y));
        !           374:          jString(buf);
        !           375:          wait(MOUSE);
        !           376:          while (!button123()) {
        !           377:            jnap(2);
        !           378:          }
        !           379:          jMoveTo(Pt(m.x+20,m.y));
        !           380:          jString(buf);
        !           381:          cursSwitch();
        !           382:          break;
        !           383:        }
        !           384:       }
        !           385:       break;
        !           386:     }
        !           387:     case CIRCLE:
        !           388:     case ELLIPSE: {
        !           389:       item = menuHit(&circleMenu,3);
        !           390:       break;
        !           391:     }
        !           392:     case ARC: {
        !           393:       item = menuHit(&arcMenu,3);
        !           394:       switch (item) {
        !           395:        case 2: 
        !           396:        case 3: {
        !           397:          t = insertReflect (t, p, item, 2);
        !           398:          break;
        !           399:        }
        !           400:       }
        !           401:       break;
        !           402:     }
        !           403:     case SPLINE: {
        !           404:       item = menuHit(&splineMenu,3);
        !           405:       switch (item) {
        !           406:        case 2: {       /* arrow */
        !           407:          b = t->otherValues.spline.used;
        !           408:          if (distance(m,t->origin)<
        !           409:              distance(m,t->otherValues.spline.plist[b])) {
        !           410:            if ((t->arrow==startARROW)||(t->arrow==doubleARROW)) {
        !           411:              t->arrow -= startARROW;
        !           412:            }
        !           413:            else {
        !           414:              t->arrow += startARROW;
        !           415:            }
        !           416:            arrow(add(p,t->otherValues.spline.plist[2]),
        !           417:                  add(p,t->otherValues.spline.plist[1]));
        !           418:          }
        !           419:          else {
        !           420:            if ((t->arrow==endARROW)||(t->arrow==doubleARROW)) {
        !           421:              t->arrow -= endARROW;
        !           422:            }
        !           423:            else {
        !           424:              t->arrow += endARROW;
        !           425:            }
        !           426:            arrow(add(p,t->otherValues.spline.plist[b-2]),
        !           427:                  add(p,t->otherValues.spline.plist[b-1]));
        !           428:          }
        !           429:          break;
        !           430:        }
        !           431:        case 3: 
        !           432:        case 4: {
        !           433:          t = insertReflect(t, p, item, 3);
        !           434:          break;
        !           435:        }
        !           436:       }
        !           437:       break;
        !           438:     }
        !           439:   }
        !           440:   if (item == 1) /* copy */ {
        !           441:     if (!noSpace) {
        !           442:       copyFlag=1;
        !           443:       changeButtons(COPYbuttons);
        !           444:     }
        !           445:   }
        !           446:   else {
        !           447:     if (item == 0) {
        !           448:       /* delete */
        !           449:       drawSelectionLines(t,p);
        !           450:       t = deleteThing(t,p);
        !           451:       thingSelected = 0;
        !           452:       copyFlag = 0;
        !           453:       changeButtons(INITbuttons);
        !           454:     }
        !           455:   }
        !           456:   return(t);
        !           457: }
        !           458: 
        !           459: RUsure ()
        !           460: {
        !           461:   int savebuttonstate;
        !           462:   int ret;
        !           463: 
        !           464:   ret = 0;
        !           465:   cursswitch (&rusure);
        !           466:   savebuttonstate = buttonState;
        !           467:   changeButtons (QUITbuttons);
        !           468:   while (!button123())
        !           469:        jnap(2);
        !           470:   if (button3()) {
        !           471:     ret = 1;
        !           472:   }
        !           473:   changeButtons (savebuttonstate);
        !           474:   while (button12())
        !           475:        jnap(2);
        !           476:   cursSwitch();
        !           477:   return (ret);
        !           478: }
        !           479: 
        !           480: struct thing *
        !           481: displayCommandMenu(h, offset) 
        !           482: register struct thing *h;
        !           483: Point offset;
        !           484: {
        !           485:   int item;
        !           486:   item = menuHit(&commandMenu,3);
        !           487:   switch (item) {
        !           488:     case GET: {
        !           489:       h = doGet(h);
        !           490:       break;
        !           491:     }
        !           492:     case PUT: {
        !           493:       doPut(h);
        !           494:       break;
        !           495:     }
        !           496:     case CLEAR: {
        !           497:       if (RUsure()) {
        !           498:        h = doClear(h);
        !           499:       }
        !           500:       break;
        !           501:     }
        !           502:     case DEFINEMACRO: {
        !           503:       if (!noSpace) {
        !           504:        h = defineMacro(h);
        !           505:       }
        !           506:       break;
        !           507:     }
        !           508:     case REDRAW: {
        !           509:       doRedraw(h, offset);
        !           510:       break;
        !           511:     }
        !           512:     case QUIT: {
        !           513:       if (RUsure()) {
        !           514:        exit (0);
        !           515:       }
        !           516:       break;
        !           517:     }
        !           518:     case GRID: {
        !           519:       gridState = (gridState==GRIDon)?GRIDoff:GRIDon;
        !           520:       drawGrid();
        !           521:       break;
        !           522:     }
        !           523:     case FLIPVIDEO: {
        !           524:       if (videoState==WHITEfield) {
        !           525:        videoState=BLACKfield;
        !           526:        rectf (&display, Drect, F_XOR);
        !           527:       }
        !           528:       else {
        !           529:        videoState=WHITEfield;
        !           530:        rectf (&display, Drect, F_XOR);
        !           531:       }
        !           532:       break;
        !           533:     }
        !           534: #ifdef DUMP
        !           535:     case DUMPIT: {
        !           536:       dump (h);
        !           537:       break;
        !           538:     }
        !           539: #endif
        !           540:   }
        !           541:   return(h);
        !           542: }
        !           543:       
        !           544: doRedraw(h, offset) 
        !           545: struct thing *h; 
        !           546: Point offset;
        !           547: {
        !           548:   register struct thing *t;
        !           549: 
        !           550:   cursinhibit();
        !           551:   xtipple(&display,brushes[PIC]);
        !           552:   cursallow();
        !           553:   if (gridState==GRIDon) {
        !           554:     drawGrid();
        !           555:   }
        !           556:   if ((t = h) != TNULL) {
        !           557:     do {
        !           558:       if (t->type==MACRO) BoundingBox(t);
        !           559:       draw(t,offset); 
        !           560:       t = t->next;
        !           561:     } while (t != h);
        !           562:   }
        !           563: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.