|
|
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: extern void getKbdText ();
9: extern int currentBrush, copyFlag, thingSelected, editDepth;
10: extern Rectangle brushes[];
11: extern int gridState, videoState, buttonState;
12:
13: struct thing *
14: doMouseButtons(t,offset)
15: register struct thing *t;
16: Point offset;
17: {
18: Point m;
19: register Rectangle *b;
20: register struct thing *t1;
21:
22: if (P->state & RESHAPED) {
23: /* Redraw screen if layer has been reshaped */
24: redrawLayer (t, offset);
25: return(t);
26: }
27: if (ptinrect (MOUSE_XY, brushes[PIC])) {
28: if (P->cursor != &crossHairs) {
29: cursswitch (&crossHairs);
30: }
31: }
32: else {
33: if (P->cursor == &crossHairs) {
34: cursswitch ((Texture *)0);
35: }
36: }
37: m = sub(MOUSE_XY,offset);
38: if (button1()) {
39: b = Select(t, add(m,offset), offset);
40: if ( b == &brushes[PIC]) {
41: copyFlag=0;
42: t1 = selectThing(m,t);
43: if (thingSelected==1) {
44: drawSelectionLines(t,offset);
45: }
46: if (t1 != TNULL) {
47: t = t1;
48: thingSelected = 1;
49: changeBrush(-1);
50: if (t->type==MACRO||t->type==TEXT) {
51: changeButtons(MOVEbuttons);
52: }
53: else {
54: changeButtons(EDITbuttons);
55: }
56: for(flashThing(t,offset);button1();jnap(2)) ;
57: drawSelectionLines(t,offset);
58: flashThing(t,offset);
59: }
60: else {
61: thingSelected = 0;
62: changeButtons((currentBrush>=0)? DRAWbuttons : INITbuttons);
63: }
64: }
65: else {
66: if (thingSelected==1) {
67: drawSelectionLines(t,offset);
68: thingSelected = 0;
69: }
70: if (b != (Rectangle *) NULL ) {
71: for (; button1(); jnap(2)) ;
72: copyFlag=0;
73: thingSelected = 0;
74: changeButtons(DRAWbuttons);
75: }
76: }
77: for (; button1(); jnap(2)) ;
78: }
79: else {
80: if (button2()) {
81: if (thingSelected) {
82: if (copyFlag!=0) {
83: drawSelectionLines (t, offset);
84: t = insert(copyThing(t,m,offset),t);
85: drawSelectionLines (t, offset);
86: /* clear button 2 - only one copy per click */
87: for ( ; button2(); jnap(2)) ;
88: }
89: else {
90: editThing(m,offset,t);
91: }
92: }
93: else {
94: if ((currentBrush>=0)&&(ptinrect(add(m,offset),brushes[PIC]))) {
95: if (currentBrush==SPLINE) changeButtons(SPLINEbuttons);
96: t = place(currentBrush,m,t,offset);
97: changeButtons(DRAWbuttons);
98: }
99: else {
100: for ( ; button2(); jnap(2)) ;
101: }
102: }
103: }
104: else {
105: if (button3()) {
106: if (thingSelected) {
107: t = displayThingMenu(m,t,offset);
108: }
109: else {
110: t = displayCommandMenu(t, offset);
111: }
112: }
113: }
114: }
115: return(t);
116: }
117:
118: struct thing *
119: place(b,p,h,os)
120: register int b;
121: Point p, os;
122: struct thing *h;
123: {
124: register struct thing *t;
125: Point r;
126: register Point *plist, *olist;
127: register int i, used, room;
128: struct thing dummy;
129: register char *s, c;
130:
131: r = near(add(p,os),h,os);
132: if (r.x!=0) {
133: p = sub(r,os);
134: }
135: switch (b) {
136: case CIRCLE: {
137: if ((t = newCircle(p)) != TNULL) {
138: t->otherValues.radius = 1;
139: draw(t,os);
140: h = insert(t,h);
141: track(p,os,GROWCIRCLE,t);
142: BoundingBox(t);
143: }
144: break;
145: }
146: case BOX: {
147: h = insert(&dummy,h);
148: r = track(p,os,BOX,h);
149: if ((t = newBox(canon (p, r))) != TNULL) {
150: h = remove (&dummy);
151: h = insert(t,h);
152: }
153: else {
154: draw (h, os);
155: h = remove (&dummy);
156: }
157: break;
158: }
159: case ELLIPSE: {
160: if ((t = newEllipse(p)) != TNULL) {
161: t->otherValues.ellipse.ht = 1;
162: t->otherValues.ellipse.wid = 1;
163: draw(t,os);
164: h = insert(t,h);
165: track(p,os,ELLIPSE,t);
166: BoundingBox(t);
167: }
168: break;
169: }
170: case LINE: {
171: h = insert(&dummy,h);
172: r = track(p,os,LINE,h);
173: if ((t = newLine(p,r)) != TNULL) {
174: h = remove (&dummy);
175: h = insert(t,h);
176: }
177: else {
178: draw (h, os);
179: h = remove (&dummy);
180: }
181: break;
182: }
183: case ARC: {
184: h = insert(&dummy,h);
185: r = track(p,os,ARC,h);
186: if ((t = newArc(p,r)) != TNULL) {
187: h = remove (&dummy);
188: h = insert(t,h);
189: }
190: else {
191: draw (h, os);
192: h = remove (&dummy);
193: }
194: break;
195: }
196: case SPLINE: {
197: if ((plist = (Point *)getSpace(5*sizeof(Point)))!=(Point *)NULL) {
198: h = insert(&dummy,h);
199: plist[1]=p;
200: used = 1; room = 3;
201: do {
202: if (used==room) {
203: olist = plist;
204: room <<= 1;
205: plist = (Point *) getSpace((room+2)*sizeof(Point));
206: if (plist==(Point *)NULL) {
207: draw (&dummy, os);
208: h = remove (&dummy);
209: plist = olist; /* Free list later */
210: used = 0;
211: break;
212: }
213: for (i=1; i<=used; i++) {
214: plist[i]=olist[i];
215: }
216: free(olist);
217: }
218: if (button2()) {
219: ++used;
220: plist[used]= track(plist[used-1],os,LINE,h);
221: xsegment(add(os,plist[used-1]),
222: add(os,plist[used]));
223: }
224: jnap(2);
225: } while (!button3());
226: for (; button3(); jnap(2)) ;
227: drawZigZag(os,plist,used);
228: if (used>2) {
229: t = newSpline(++used,room,plist);
230: }
231: else {
232: t = TNULL;
233: free (plist);
234: }
235: h = remove(&dummy);
236: h = insert(t,h);
237: }
238: break;
239: }
240: case TEXT: {
241: register char s[MAXTEXT+1];
242: register char *ss;
243: register char *q, *qq;
244: getKbdText (s, add(p,os), 0, &carrot, MAXTEXT);
245: ss = s;
246: t = TNULL;
247: if ((q=getSpace(strlen(s)))!=NULL) {
248: for (qq=q; *qq++ = *ss++;) {
249: }
250: t = newText(p,q);
251: h = insert(t,h);
252: }
253: break;
254: }
255: }
256: if (t!=TNULL) {
257: if (t->type != CIRCLE && t->type != ELLIPSE) {
258: draw(t,os);
259: }
260: }
261: return(h);
262: }
263:
264: removeReflectionReferences(m)
265: register struct macro *m;
266: {
267: register struct macro *t;
268:
269: if ((t=m)!=(struct macro *)NULL) {
270: t->xReflectionOf = (struct macro *) NULL;
271: t->yReflectionOf = (struct macro *) NULL;
272: for (t=t->next; t!=(struct macro *)NULL; t=t->next) {
273: if (t->xReflectionOf==m) {
274: t->xReflectionOf = (struct macro *) NULL;
275: }
276: if (t->yReflectionOf==m) {
277: t->yReflectionOf = (struct macro *) NULL;
278: }
279: }
280: }
281: }
282:
283: clearKeyboard()
284: {
285: for (; kbdchar() != -1; ) ;
286: }
287:
288: redrawLayer (h, offset)
289: struct thing *h;
290: Point offset;
291: {
292: cursinhibit();
293: brushInit(); /* Init outline of brush boxes. */
294: drawFrame(); /* display drawing area and brushes */
295: currentBrush = -1;
296: buttonState = INITbuttons;
297: thingSelected = 0;
298: copyFlag = 0;
299: doRedraw (h, offset);
300: if (videoState == BLACKfield) {
301: rectf(&display, Drect,F_XOR);
302: }
303: if (editDepth) {
304: drawEDbutton (editDepth);
305: }
306: cursallow();
307: P->state &= ~RESHAPED;
308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.