|
|
1.1 root 1: #include "univ.h"
2:
3: extern Script ObjScript;
4: Script Generic;
5: Index CIndex;
6: Entry *CarteEntry();
7:
8: Entry *ObjectEntry(i)
9: {
10: return CIndex ? CarteEntry(CIndex,i): (Entry*)0;
11: }
12:
13: ObjectLimits(s)
14: Script *s;
15: {
16: register Carte *c;
17:
18: if( !CIndex ) return;
19: assert( MJR(CIndex)&CARTE );
20: c = IndexToCarte(CIndex);
21: s->items = c->size;
22: s->width = c->width;
23: }
24:
25: Entry *CarteEntry(ix, i)
26: Index ix;
27: register short i;
28: {
29: static Entry e;
30: static Script subscript[4];
31: extern int MenuNest;
32:
33: register Carte *nest, *c;
34: register int j;
35: register Script *s;
36: Index nix;
37:
38: assert( MJR(ix)&CARTE );
39: c = IndexToCarte(ix);
40: if( i >= c->size ) return 0;
41: e.script = 0;
42: if( c->attrib&NUMERIC ){
43: e.action = HostNumeric;
44: e.text = itoa( (int) (e.opand = i + (short) c->bin[1]) );
45: return &e;
46: }
47: for( j = 1; ; ++j ){
48: assert( i>=0 && j<=c->size );
49: if( nix=c->bin[j], MJR(nix)&CARTE ){
50: nest = IndexToCarte(nix);
51: if( nest->bin[0] ){
52: if( i == 0 ){
53: e.action = HostAction;
54: e.opand = (long) &nest->bin[0];
55: e.text = IndexToStr(nest->bin[0]);
56: e.script = s = &subscript[MenuNest];
57: s->cindex = nix;
58: s->generator = ObjectEntry;
59: s->limits = ObjectLimits;
60: return &e;
61: }
62: --i;
63: } else {
64: if( i < nest->size )
65: return CarteEntry(nix,i);
66: i -= nest->size;
67: }
68: } else {
69: if( i == 0 ){
70: e.action = HostAction;
71: e.opand = (long) &c->bin[j];
72: e.text = IndexToStr(c->bin[j]);
73: return &e;
74: }
75: --i;
76: }
77: }
78: }
79:
80: Entry *SubEntry(i)
81: register i;
82: {
83: int MakeCurrent(); extern Pad Sentinel;
84: register Pad *p;
85: static Entry e = { 0, MakeCurrent, 0 };
86:
87: for( p = Sentinel.back; p != &Sentinel && i-- > 0; p = p->back ){}
88: if( p == &Sentinel ) return (Entry *) 0;
89: e.text = p->name;
90: e.opand = (long) p;
91: return &e;
92: }
93:
94: SubLimits(s)
95: register Script *s;
96: {
97: extern Pad Sentinel;
98: register Pad *p;
99: register l;
100:
101: s->items = 0;
102: s->width = 1;
103: for( p = Sentinel.back; p != &Sentinel ; p = p->back ){
104: ++s->items;
105: l = strlen(p->name);
106: if( l > s->width ) s->width = l;
107: }
108: }
109:
110: Script SubScript = { SubEntry, SubLimits };
111:
112: Entry *PadEntry(i)
113: register i;
114: {
115: static Entry e[] = {
116: { "\376", 0, 0 },
117: { "reshape", Reshape, 0 },
118: { "move", Move, 0 },
119: { "close", DeletePick, 0 },
120: { "(fold)", 0, 0 },
121: { "top", 0, 0, &SubScript}
122: };
123:
124: if( i > 5 ) return (Entry *) 0;
125: if( i == 4 && Current ) return FoldEntry(&Current->attributes);
126: return e+i;
127: }
128:
129: Entry *LineEntry(i)
130: {
131: static Entry e [] = { { "\376", 0, 0 },
132: { "cut", CutLine, 0 },
133: { "sever", Sever, 0 }, };
134:
135: if( i<3 ) return e+i;
136: if( i==3 && Selected.line)
137: return FoldEntry(&Selected.line->attributes);
138: return 0;
139: }
140:
141: Script ObjScript = { ObjectEntry, ObjectLimits, &Generic };
142:
143: MOUSEServe()
144: {
145: register int but;
146: register Line *lop; /* Line or Pad! */
147: register Pad *p;
148: register Entry *e = 0;
149: register Script *s;
150: register char *confirm = "confirm: ";
151:
152: if( !ptinrect(mouse.xy,Drect) ) return;
153: Again:
154: switch( butts ){
155: case BUTT1:
156: Pointing();
157: if( !button23() ) goto AllDone;
158: while( button1() ) jnap(2);
159: goto Again;
160: case BUTT2:
161: but = 2;
162: Generic.generator = LineEntry;
163: if( lop = Selected.line )
164: MakeCurrent(Selected.pad);
165: break;
166: case BUTT3:
167: if( (p = PickPad(mouse.xy)) && (p != Current) ){
168: MakeCurrent(p);
169: goto Again;
170: }
171: Generic.generator = PadEntry;
172: lop = (Line*) Current;
173: }
174: switch( butts ){
175: case BUTT3:
176: but = 3;
177: case BUTT2:
178: ObjScript.cindex = 0;
179: if( lop ){
180: if( lop->ptop != 255 ){
181: ObjScript.prevtop = lop->ptop;
182: ObjScript.prevhit = lop->phit;
183: }
184: ObjScript.cindex = lop->carte;
185: HostObject = lop->object;
186: HostParent = Current ? Current->object : (long)0;
187: }
188: if( e = ScriptHit(&ObjScript, but, (RectList*)0) ){
189: if( lop ){
190: lop->ptop = ObjScript.prevtop;
191: lop->phit = ObjScript.prevhit;
192: }
193: if( e->text[strlen(e->text)-1] == '?' ){
194: cursswitch(&Danger);
195: if( Configuration&NOVICEUSER )
196: InvertKBDrect( confirm, e->text );
197: while( !butts ) waitMOUSE();
198: if( !button(but) ) e = 0;
199: while( butts ) waitMOUSE();
200: if( Configuration&NOVICEUSER )
201: PaintKBD();
202: cursswitch( Pcursor );
203: }
204: }
205: if( e && e->action ){
206: if( but == 3 && lop) FlashBorder(lop);
207: (e->action)(e->opand);
208: if( but == 2 ) Select((Line*)0, (Pad*) 0);
209: }
210: }
211: AllDone:
212: while( butts ) waitMOUSE();
213: }
214:
215: FlashBorder(p)
216: Pad *p;
217: {
218: HeavyBorder(p);
219: wait(CPU);
220: HeavyBorder(p);
221: wait(CPU);
222: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.