1 /*------------------------------------------------------------\
2 |                                                             |
3 | This file is part of the Alliance CAD System Copyright      |
4 | (C) Laboratoire LIP6 - D�partement ASIM Universite P&M Curie|
5 |                                                             |
6 | Home page      : http://www-asim.lip6.fr/alliance/          |
7 | E-mail         : mailto:alliance-users@asim.lip6.fr       |
8 |                                                             |
9 | This progam is  free software; you can redistribute it      |
10 | and/or modify it under the  terms of the GNU General Public |
11 | License as  published by the Free Software Foundation;      |
12 | either version 2 of the License, or (at your option) any    |
13 | later version.                                              |
14 |                                                             |
15 | Alliance VLSI  CAD System  is distributed  in the hope that |
16 | it  will be useful, but WITHOUT  ANY WARRANTY;              |
17 | without even the  implied warranty of MERCHANTABILITY or    |
18 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General       |
19 | Public License for more details.                            |
20 |                                                             |
21 | You should have received a copy  of the GNU General Public  |
22 | License along with the GNU C Library; see the file COPYING. |
23 | If not, write to the Free Software Foundation, Inc.,        |
24 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.                     |
25 |                                                             |
26 \------------------------------------------------------------*/
27 
28 /*------------------------------------------------------------\
29 |                                                             |
30 | Tool    :                   GRAAL                           |
31 |                                                             |
32 | File    :                   Event.c                         |
33 |                                                             |
34 | Author  :                Jacomme Ludovic                    |
35 |                                                             |
36 | Date    :                  28.03.95                         |
37 |                                                             |
38 \------------------------------------------------------------*/
39 
40 /*------------------------------------------------------------\
41 |                                                             |
42 |                         Include Files                       |
43 |                                                             |
44 \------------------------------------------------------------*/
45 
46 # include <stdio.h>
47 # include <X11/Intrinsic.h>
48 # include <X11/StringDefs.h>
49 # include <Xm/Xm.h>
50 
51 
52 # include "mut.h"
53 # include "mph.h"
54 # include "rds.h"
55 # include "rpr.h"
56 # include "GSB.h"
57 # include "GRM.h"
58 # include "GMX.h"
59 # include "GTB.h"
60 # include "GMV.h"
61 # include "GMS.h"
62 # include "GME.h"
63 # include "GMH.h"
64 # include "GMC.h"
65 # include "GMT.h"
66 # include "GMX_motif.h"
67 # include "GMX_grid.h"
68 # include "GMX_cursor.h"
69 # include "GMX_event.h"
70 # include "GMX_message.h"
71 # include "GMX_graphic.h"
72 # include "GME_select.h"
73 # include "GMT_druc.h"
74 
75 /*------------------------------------------------------------\
76 |                                                             |
77 |                           Constants                         |
78 |                                                             |
79 \------------------------------------------------------------*/
80 /*------------------------------------------------------------\
81 |                                                             |
82 |                            Types                            |
83 |                                                             |
84 \------------------------------------------------------------*/
85 /*------------------------------------------------------------\
86 |                                                             |
87 |                          Variables                          |
88 |                                                             |
89 \------------------------------------------------------------*/
90 /*------------------------------------------------------------\
91 |                                                             |
92 |                          Translation                        |
93 |                                                             |
94 \------------------------------------------------------------*/
95 
96   static String GraalEventTranslation =
97 
98     "<Btn1Down>:      CallbackEvent(  0 )\n\
99      <Btn3Down>:      CallbackEvent(  1 )\n\
100      Shift<Btn4Down>: CallbackEvent(  7 )\n\
101      Shift<Btn5Down>: CallbackEvent(  8 )\n\
102      Ctrl<Btn4Down>:  CallbackEvent(  9 )\n\
103      Ctrl<Btn5Down>:  CallbackEvent( 10 )\n\
104      <Btn4Down>:      CallbackEvent(  5 )\n\
105      <Btn5Down>:      CallbackEvent(  6 )\n\
106      <Motion>:        CallbackEvent(  2 )\n\
107      <EnterWindow>:   CallbackEvent(  3 )\n\
108      <LeaveWindow>:   CallbackEvent(  4 )\n\
109      <Key>osfUp:      CallbackEvent(  5 )\n\
110      <Key>osfDown:    CallbackEvent(  6 )\n\
111      <Key>osfLeft:    CallbackEvent(  7 )\n\
112      <Key>osfRight:   CallbackEvent(  8 )\n\
113      <Key>Z:          CallbackEvent(  9 )\n\
114      <Key>M:          CallbackEvent( 10 )\n\
115      <Key>F:          CallbackEvent( 11 )\n\
116      <Key>R:          CallbackEvent( 12 )\n\
117      <Key>U:          CallbackEvent( 13 )\n\
118      <Key>I:          CallbackEvent( 14 )\n\
119      <Key>C:          CallbackEvent( 15 )\n\
120      <Key>P:          CallbackEvent( 16 )\n\
121      Shift<Key>Tab:   CallbackEvent( 17 )\n\
122      <Key>Tab:        CallbackEvent( 18 )";
123 
124 /*------------------------------------------------------------\
125 |                                                             |
126 |                         Event Count                         |
127 |                                                             |
128 \------------------------------------------------------------*/
129 
130   static char GraalMaxEventEditTable[] =
131 
132   {
133     2,  /* GRAAL_EDIT_MEASURE           */
134     2,  /* GRAAL_CREATE_SEGMENT         */
135     2,  /* GRAAL_CREATE_SEGMENT_WIRE    */
136     1,  /* GRAAL_CREATE_VIA             */
137     2,  /* GRAAL_CREATE_TRANSISTOR      */
138     2,  /* GRAAL_CREATE_TRANSISTOR_WIRE */
139     1,  /* GRAAL_CREATE_CONNECTOR       */
140     1,  /* GRAAL_CREATE_INSTANCE        */
141     1,  /* GRAAL_CREATE_REFERENCE       */
142     2,  /* GRAAL_CREATE_ABUTMENTBOX     */
143     1,  /* GRAAL_SELECT_POINT_IDENTIFY  */
144     1,  /* GRAAL_SELECT_POINT_COPY      */
145     1,  /* GRAAL_SELECT_POINT_MOVE      */
146     1,  /* GRAAL_SELECT_POINT_DELETE    */
147     1,  /* GRAAL_SELECT_POINT_STRETCH   */
148     1,  /* GRAAL_SELECT_POINT_MODIFY    */
149     2,  /* GRAAL_SELECT_WINDOW_IDENTIFY */
150     2,  /* GRAAL_SELECT_WINDOW_COPY     */
151     2,  /* GRAAL_SELECT_WINDOW_MOVE     */
152     2,  /* GRAAL_SELECT_WINDOW_DELETE   */
153     2,  /* GRAAL_SELECT_WINDOW_STRETCH  */
154     2,  /* GRAAL_SELECT_WINDOW_MODIFY   */
155     2,  /* GRAAL_EDIT_COPY_POINT        */
156     2,  /* GRAAL_EDIT_COPY_WINDOW       */
157     2,  /* GRAAL_EDIT_MOVE_POINT        */
158     2,  /* GRAAL_EDIT_MOVE_WINDOW       */
159     2,  /* GRAAL_EDIT_STRETCH_POINT     */
160     2,  /* GRAAL_EDIT_STRETCH_WINDOW    */
161     1,  /* GRAAL_TOOLS_EQUI             */
162     2,  /* GRAAL_TOOLS_FLATTEN          */
163     2,  /* GRAAL_TOOLS_UNFLATTEN        */
164     2,  /* GRAAL_TOOLS_PEEK             */
165     2,  /* GRAAL_TOOLS_DRUC             */
166     2,  /* GRAAL_TOOLS_REAL_FLATTEN     */
167     1,  /* GRAAL_TOOLS_HIERARCHY_DOWN   */
168     1,  /* GRAAL_TOOLS_HIERARCHY_SHOW   */
169     2   /* GRAAL_CREATE_BIGVIA          */
170   };
171 
172   static char GraalInputEventEditTable[] =
173 
174   {
175     GRAAL_INPUT_HALF_BOX, /* GRAAL_EDIT_MEASURE           */
176     GRAAL_INPUT_ORTHO,    /* GRAAL_CREATE_SEGMENT         */
177     GRAAL_INPUT_LSTRING,  /* GRAAL_CREATE_SEGMENT_WIRE    */
178     GRAAL_INPUT_POINT,    /* GRAAL_CREATE_VIA             */
179     GRAAL_INPUT_ORTHO,    /* GRAAL_CREATE_TRANSISTOR      */
180     GRAAL_INPUT_LSTRING,  /* GRAAL_CREATE_TRANSISTOR_WIRE */
181     GRAAL_INPUT_POINT,    /* GRAAL_CREATE_CONNECTOR       */
182     GRAAL_INPUT_POINT,    /* GRAAL_CREATE_INSTANCE        */
183     GRAAL_INPUT_POINT,    /* GRAAL_CREATE_REFERENCE       */
184     GRAAL_INPUT_BOX,      /* GRAAL_CREATE_ABUTMENTBOX     */
185     GRAAL_INPUT_POINT,    /* GRAAL_SELECT_POINT_IDENTIFY  */
186     GRAAL_INPUT_POINT,    /* GRAAL_SELECT_POINT_COPY      */
187     GRAAL_INPUT_POINT,    /* GRAAL_SELECT_POINT_MOVE      */
188     GRAAL_INPUT_POINT,    /* GRAAL_SELECT_POINT_DELETE    */
189     GRAAL_INPUT_POINT,    /* GRAAL_SELECT_POINT_STRETCH   */
190     GRAAL_INPUT_POINT,    /* GRAAL_SELECT_POINT_MODIFY    */
191     GRAAL_INPUT_BOX,      /* GRAAL_SELECT_WINDOW_IDENTIFY */
192     GRAAL_INPUT_BOX,      /* GRAAL_SELECT_WINDOW_COPY     */
193     GRAAL_INPUT_BOX,      /* GRAAL_SELECT_WINDOW_MOVE     */
194     GRAAL_INPUT_BOX,      /* GRAAL_SELECT_WINDOW_DELETE   */
195     GRAAL_INPUT_BOX,      /* GRAAL_SELECT_WINDOW_STRETCH  */
196     GRAAL_INPUT_BOX,      /* GRAAL_SELECT_WINDOW_MODIFY   */
197     GRAAL_INPUT_LINE,     /* GRAAL_EDIT_COPY_POINT        */
198     GRAAL_INPUT_LINE,     /* GRAAL_EDIT_COPY_WINDOW       */
199     GRAAL_INPUT_LINE,     /* GRAAL_EDIT_MOVE_POINT        */
200     GRAAL_INPUT_LINE,     /* GRAAL_EDIT_MOVE_WINDOW       */
201     GRAAL_INPUT_ORTHO,    /* GRAAL_EDIT_STRETCH_POINT     */
202     GRAAL_INPUT_ORTHO,    /* GRAAL_EDIT_STRETCH_WINDOW    */
203     GRAAL_INPUT_POINT,    /* GRAAL_TOOLS_EQUI             */
204     GRAAL_INPUT_BOX,      /* GRAAL_TOOLS_FLATTEN          */
205     GRAAL_INPUT_BOX,      /* GRAAL_TOOLS_UNFLATTEN        */
206     GRAAL_INPUT_BOX,      /* GRAAL_TOOLS_PEEK             */
207     GRAAL_INPUT_BOX,      /* GRAAL_TOOLS_DRUC             */
208     GRAAL_INPUT_BOX,      /* GRAAL_TOOLS_REAL_FLATTEN     */
209     GRAAL_INPUT_POINT,    /* GRAAL_TOOLS_HIERARCHY_DOWN   */
210     GRAAL_INPUT_POINT,    /* GRAAL_TOOLS_HIERARCHY_SHOW   */
211     GRAAL_INPUT_BOX       /* GRAAL_CREATE_BIGVIA          */
212   };
213 
214   static char GraalMaxEventZoomTable[] =
215 
216   {
217     1,  /* GRAAL_ZOOM_CENTER            */
218     2,  /* GRAAL_ZOOM_IN                */
219     2   /* GRAAL_ZOOM_PAN               */
220   };
221 
222   static char GraalInputEventZoomTable[] =
223 
224   {
225     GRAAL_INPUT_POINT,  /* GRAAL_ZOOM_CENTER            */
226     GRAAL_INPUT_BOX,    /* GRAAL_ZOOM_IN                */
227     GRAAL_INPUT_LINE    /* GRAAL_ZOOM_PAN               */
228   };
229 
230 /*------------------------------------------------------------\
231 |                                                             |
232 |                          Translation                        |
233 |                                                             |
234 \------------------------------------------------------------*/
235 
236 /*------------------------------------------------------------\
237 |                                                             |
238 |                      Expose Edit Zoom                       |
239 |                                                             |
240 \------------------------------------------------------------*/
241 
242   static long     GraalLambdaEventZoomX[ 2 ] = { 0, 0 };
243   static long     GraalLambdaEventZoomY[ 2 ] = { 0, 0 };
244   static char     GraalMaxEventZoom          = 0;
245          char     GraalCountEventZoom        = 0;
246 
247   static long     GraalLambdaEventEditX[ 2 ] = { 0, 0 };
248   static long     GraalLambdaEventEditY[ 2 ] = { 0, 0 };
249   static char     GraalMaxEventEdit          = 2;
250          char     GraalCountEventEdit        = 0;
251 
252   static char     GraalFirstExpose           = GRAAL_TRUE;
253 
254 /*------------------------------------------------------------\
255 |                                                             |
256 |                          Input                              |
257 |                                                             |
258 \------------------------------------------------------------*/
259 
260  static char GraalInputMode     = GRAAL_INPUT_HALF_BOX;
261  static char GraalSaveInputMode = GRAAL_INPUT_HALF_BOX;
262  static char GraalEditMode      = GRAAL_EDIT_MEASURE;
263  static char GraalSaveEditMode  = GRAAL_EDIT_MEASURE;
264 
265 /*------------------------------------------------------------\
266 |                                                             |
267 |                          Edit Message                       |
268 |                                                             |
269 \------------------------------------------------------------*/
270 
271   static void (*GraalPromptMessage)()     = GraalPromptEditMeasure;
272   static void (*GraalSavePromptMessage)() = GraalPromptEditMeasure;
273 
274 /*------------------------------------------------------------\
275 |                                                             |
276 |                           Functions                         |
277 |                                                             |
278 \------------------------------------------------------------*/
279 /*------------------------------------------------------------\
280 |                                                             |
281 |                     GraalChangeEditMode                     |
282 |                                                             |
283 \------------------------------------------------------------*/
284 
GraalChangeEditMode(EditMode,PromptMessage)285 void GraalChangeEditMode( EditMode , PromptMessage )
286 
287    char  EditMode;
288    void (*PromptMessage)();
289 {
290   rdsbegin();
291 
292   if ( EditMode & GRAAL_ZOOM_MARK )
293   {
294     EditMode = EditMode & ~GRAAL_ZOOM_MARK;
295 
296     GraalCountEventZoom = 0;
297     GraalMaxEventZoom   = GraalMaxEventZoomTable[ (int)EditMode ];
298 
299     if ( ! ( GraalEditMode & GRAAL_ZOOM_MARK ) )
300     {
301       GraalSaveEditMode      = GraalEditMode;
302       GraalSaveInputMode     = GraalInputMode;
303       GraalSavePromptMessage = GraalPromptMessage;
304     }
305 
306     GraalInputMode     = GraalInputEventZoomTable[ (int)EditMode ];
307     GraalPromptMessage = PromptMessage;
308     GraalEditMode      = EditMode | GRAAL_ZOOM_MARK;
309 
310     GraalChangeCursorType( NULL, NULL, 0, GraalInputMode );
311   }
312   else
313   {
314     if ( GraalEditMode & GRAAL_ZOOM_MARK )
315     {
316       GraalSaveEditMode      = EditMode;
317       GraalSaveInputMode     = GraalInputEventEditTable[ (int)EditMode ];
318       GraalSavePromptMessage = PromptMessage;
319       GraalCountEventEdit    = 0;
320       GraalMaxEventEdit      = GraalMaxEventEditTable[ (int)EditMode ];
321     }
322     else
323     {
324       if ( GraalEditMode != EditMode )
325       {
326         GraalCountEventEdit = 0;
327         GraalMaxEventEdit   = GraalMaxEventEditTable[ (int)EditMode ];
328         GraalEditMode       = EditMode;
329         GraalInputMode      = GraalInputEventEditTable[ (int)EditMode ];
330         GraalPromptMessage  = PromptMessage;
331 
332         GraalChangeCursorType( NULL, NULL, 0, GraalInputMode );
333       }
334     }
335 
336     GraalEditUnselectAll();
337   }
338 
339   GraalPromptMessage();
340 
341   rdsend();
342 }
343 
344 /*------------------------------------------------------------\
345 |                                                             |
346 |                   GraalContinueEditMode                     |
347 |                                                             |
348 \------------------------------------------------------------*/
349 
GraalContinueEditMode(EditMode,PromptMessage,CountEvent)350 void GraalContinueEditMode( EditMode , PromptMessage, CountEvent )
351 
352    char  EditMode;
353    void (*PromptMessage)();
354    char  CountEvent;
355 {
356   rdsbegin();
357 
358   if ( GraalEditMode & GRAAL_ZOOM_MARK )
359   {
360     GraalSaveEditMode      = EditMode;
361     GraalSaveInputMode     = GraalInputEventEditTable[ (int)EditMode ];
362     GraalSavePromptMessage = PromptMessage;
363     GraalCountEventEdit    = CountEvent;
364     GraalMaxEventEdit      = GraalMaxEventEditTable[ (int)EditMode ];
365   }
366   else
367   {
368     GraalCountEventEdit = CountEvent;
369     GraalMaxEventEdit   = GraalMaxEventEditTable[ (int)EditMode ];
370     GraalEditMode       = EditMode;
371     GraalInputMode      = GraalInputEventEditTable[ (int)EditMode ];
372     GraalPromptMessage  = PromptMessage;
373 
374     GraalChangeCursorType( GraalLambdaEventEditX,
375                            GraalLambdaEventEditY,
376                            GraalCountEventEdit,
377                            GraalInputMode );
378 
379   }
380 
381   GraalPromptMessage();
382 
383   rdsend();
384 }
385 
386 /*------------------------------------------------------------\
387 |                                                             |
388 |                      GraalTreatEventZoom                    |
389 |                                                             |
390 \------------------------------------------------------------*/
391 
GraalTreatEventZoom()392 void GraalTreatEventZoom()
393 
394 {
395   rdsbegin();
396 
397   switch ( GraalEditMode )
398   {
399     case GRAAL_ZOOM_CENTER :
400 
401       GraalZoomCenter( GraalLambdaEventZoomX[ 0 ],
402                        GraalLambdaEventZoomY[ 0 ] );
403       break;
404 
405     case GRAAL_ZOOM_IN     :
406 
407       GraalZoomIn( GraalLambdaEventZoomX[ 0 ],
408                    GraalLambdaEventZoomY[ 0 ],
409                    GraalLambdaEventZoomX[ 1 ],
410                    GraalLambdaEventZoomY[ 1 ] );
411       break;
412 
413     case GRAAL_ZOOM_PAN    :
414 
415       GraalZoomPan( GraalLambdaEventZoomX[ 0 ],
416                     GraalLambdaEventZoomY[ 0 ],
417                     GraalLambdaEventZoomX[ 1 ],
418                     GraalLambdaEventZoomY[ 1 ] );
419       break;
420   }
421 
422   rdsend();
423 }
424 
425 /*------------------------------------------------------------\
426 |                                                             |
427 |                      GraalTreatEventEdit                    |
428 |                                                             |
429 \------------------------------------------------------------*/
430 
GraalTreatEventEdit()431 void GraalTreatEventEdit()
432 
433 {
434   long DeltaX;
435   long DeltaY;
436   long X1;
437   long X2;
438   long Y1;
439   long Y2;
440 
441   rdsbegin();
442 
443   X1 = GraalLambdaEventEditX[0];
444   X2 = GraalLambdaEventEditX[1];
445   Y1 = GraalLambdaEventEditY[0];
446   Y2 = GraalLambdaEventEditY[1];
447 
448   if ( ( GraalInputMode == GRAAL_INPUT_LSTRING ) ||
449        ( GraalInputMode == GRAAL_INPUT_ORTHO   ) ||
450        ( GraalInputMode == GRAAL_INPUT_SORTHO  ) )
451   {
452     DeltaX = X1 - X2;
453     DeltaY = Y1 - Y2;
454 
455     if ( DeltaX < 0 ) DeltaX = - DeltaX;
456     if ( DeltaY < 0 ) DeltaY = - DeltaY;
457 
458     if ( DeltaX > DeltaY )
459     {
460       Y2 = Y1;
461 
462       GraalLambdaEventEditX[0] = X2;
463       GraalLambdaEventEditY[0] = Y2;
464     }
465     else
466     {
467       X2 = X1;
468 
469       GraalLambdaEventEditX[0] = X2;
470       GraalLambdaEventEditY[0] = Y2;
471     }
472   }
473 
474   if ( GraalInputMode == GRAAL_INPUT_LSTRING )
475   {
476     GraalChangeCursorType( GraalLambdaEventEditX,
477                            GraalLambdaEventEditY,
478                            1, GraalInputMode );
479 
480     GraalCountEventEdit = 1;
481   }
482   else
483   {
484     GraalChangeCursorType( NULL, NULL, 0,
485                            GraalInputMode );
486 
487     GraalCountEventEdit = 0;
488   }
489 
490   switch ( GraalEditMode )
491   {
492     case GRAAL_EDIT_MEASURE           :
493 
494       break;
495 
496     case GRAAL_CREATE_SEGMENT         :
497     case GRAAL_CREATE_SEGMENT_WIRE    :
498 
499       GraalCreateSegmentMbk( X1, Y1, X2, Y2 );
500 
501       break;
502 
503     case GRAAL_CREATE_VIA             :
504 
505       GraalCreateViaMbk( X1, Y1 );
506 
507       break;
508 
509     case GRAAL_CREATE_BIGVIA          :
510 
511       GraalCreateBigViaMbk( X1, Y1, X2, Y2 );
512 
513       break;
514 
515     case GRAAL_CREATE_TRANSISTOR      :
516     case GRAAL_CREATE_TRANSISTOR_WIRE :
517 
518       GraalCreateTransistorMbk( X1, Y1, X2, Y2 );
519 
520       break;
521 
522     case GRAAL_CREATE_CONNECTOR       :
523 
524       GraalCreateConnectorMbk( X1, Y1 );
525 
526       break;
527 
528     case GRAAL_CREATE_REFERENCE       :
529 
530       GraalCreateReferenceMbk( X1, Y1 );
531 
532       break;
533 
534     case GRAAL_CREATE_INSTANCE        :
535 
536       GraalCreateInstanceMbk( X1, Y1 );
537 
538       break;
539 
540     case GRAAL_CREATE_ABUTMENTBOX  :
541 
542      GraalCreateAbutmentBoxMbk( X1, Y1, X2, Y2 );
543 
544     break;
545 
546     case GRAAL_SELECT_POINT_IDENTIFY :
547 
548       GraalEditSelectPoint( X1, Y1 );
549       GraalEditIdentify();
550 
551     break;
552 
553     case GRAAL_SELECT_WINDOW_IDENTIFY :
554 
555       GraalEditSelectFence( X1, Y1, X2, Y2 );
556       GraalEditIdentify();
557 
558     break;
559 
560     case GRAAL_SELECT_POINT_COPY :
561 
562       GraalEditSelectPointCopy( X1, Y1 );
563 
564     break;
565 
566     case GRAAL_SELECT_WINDOW_COPY :
567 
568       GraalEditSelectWindowCopy( X1, Y1, X2, Y2 );
569 
570     break;
571 
572     case GRAAL_EDIT_COPY_POINT :
573 
574       GraalEditCopy( X1, Y1, X2, Y2, 0 );
575 
576     break;
577 
578     case GRAAL_EDIT_COPY_WINDOW :
579 
580       GraalEditCopy( X1, Y1, X2, Y2, 1 );
581 
582     break;
583 
584     case GRAAL_SELECT_POINT_MOVE :
585 
586       GraalEditSelectPointMove( X1, Y1 );
587 
588     break;
589 
590     case GRAAL_SELECT_WINDOW_MOVE :
591 
592       GraalEditSelectWindowMove( X1, Y1, X2, Y2 );
593 
594     break;
595 
596     case GRAAL_EDIT_MOVE_POINT :
597 
598       GraalEditMove( X1, Y1, X2, Y2, 0 );
599 
600     break;
601 
602     case GRAAL_EDIT_MOVE_WINDOW :
603 
604       GraalEditMove( X1, Y1, X2, Y2, 1 );
605 
606     break;
607 
608     case GRAAL_SELECT_POINT_DELETE :
609 
610       GraalEditSelectPointDelete( X1, Y1 );
611 
612     break;
613 
614     case GRAAL_SELECT_WINDOW_DELETE :
615 
616       GraalEditSelectWindowDelete( X1, Y1, X2, Y2 );
617 
618     break;
619 
620     case GRAAL_SELECT_POINT_STRETCH :
621 
622       GraalEditSelectPointStretch( X1, Y1 );
623 
624     break;
625 
626     case GRAAL_SELECT_WINDOW_STRETCH :
627 
628       GraalEditSelectWindowStretch( X1, Y1, X2, Y2 );
629 
630     break;
631 
632     case GRAAL_EDIT_STRETCH_POINT :
633 
634       GraalEditStretch( X1, Y1, X2, Y2, 0 );
635 
636     break;
637 
638     case GRAAL_EDIT_STRETCH_WINDOW :
639 
640       GraalEditStretch( X1, Y1, X2, Y2, 1 );
641 
642     break;
643 
644     case GRAAL_SELECT_POINT_MODIFY :
645 
646       GraalEditSelectPointModify( X1, Y1 );
647 
648     break;
649 
650     case GRAAL_SELECT_WINDOW_MODIFY :
651 
652       GraalEditSelectWindowModify( X1, Y1, X2, Y2 );
653 
654     break;
655 
656     case GRAAL_TOOLS_EQUI :
657 
658       GraalToolsSelectEqui( X1, Y1 );
659 
660     break;
661 
662     case GRAAL_TOOLS_PEEK :
663 
664        GraalToolsPeek( X1, Y1, X2, Y2 );
665 
666     break;
667 
668     case GRAAL_TOOLS_FLATTEN :
669 
670       GraalToolsSelectFlatten( X1, Y1, X2, Y2 );
671 
672     break;
673 
674     case GRAAL_TOOLS_UNFLATTEN :
675 
676       GraalToolsSelectUnflatten( X1, Y1, X2, Y2 );
677 
678     break;
679 
680     case GRAAL_TOOLS_DRUC :
681 
682       GraalToolsDruc( X1, Y1, X2, Y2 );
683 
684     break;
685 
686     case GRAAL_TOOLS_REAL_FLATTEN :
687 
688       GraalToolsSelectRealFlatten( X1, Y1, X2, Y2 );
689 
690     break;
691 
692     case GRAAL_TOOLS_HIERARCHY_DOWN :
693 
694       GraalToolsSelectHierarchyDown( X1, Y1 );
695 
696     break;
697 
698     case GRAAL_TOOLS_HIERARCHY_SHOW :
699 
700       GraalEditSelectPoint( X1, Y1 );
701       GraalToolsHierarchyShow( X1, Y1 );
702 
703     break;
704   }
705 
706   rdsend();
707 }
708 
709 /*------------------------------------------------------------\
710 |                                                             |
711 |                       CallbackEvent                         |
712 |                                                             |
713 \------------------------------------------------------------*/
714 
CallbackEvent(MyWidget,Event,Args,Argc)715 void CallbackEvent ( MyWidget, Event, Args, Argc )
716 
717      Widget        MyWidget;
718      XButtonEvent *Event;
719      String       *Args;
720      int          *Argc;
721 {
722   char      MouseEvent;
723   int       FlagUp;
724   Position  OldLambdaCursorX;
725   Position  OldLambdaCursorY;
726 
727   rdsbegin();
728 
729   MouseEvent = atoi( Args[ 0 ] );
730 
731   if ( MouseEvent == GRAAL_LEAVE )
732   {
733     GraalUndisplayCursor();
734     GraalCursorInside = GRAAL_FALSE;
735   }
736   else
737   {
738     OldLambdaCursorX = GraalLambdaCursorX;
739     OldLambdaCursorY = GraalLambdaCursorY;
740 
741     GraalComputeCursor( Event->x, Event->y );
742 
743     switch ( MouseEvent )
744     {
745       case GRAAL_B1DN   :
746 
747         if ( GraalEditMode & GRAAL_ZOOM_MARK )
748         {
749           if ( GraalCountEventZoom < GraalMaxEventZoom )
750           {
751             GraalLambdaEventZoomX[ (int)GraalCountEventZoom ] = GraalLambdaCursorX;
752             GraalLambdaEventZoomY[ (int)GraalCountEventZoom ] = GraalLambdaCursorY;
753 
754             GraalCountEventZoom = GraalCountEventZoom + 1;
755 
756             GraalPointCursor();
757 
758             if ( GraalCountEventZoom == GraalMaxEventZoom )
759             {
760               GraalChangeCursorType( NULL, NULL, 0, GraalInputMode );
761 
762               GraalTreatEventZoom();
763 
764               GraalInputMode      = GraalSaveInputMode;
765               GraalEditMode       = GraalSaveEditMode;
766               GraalPromptMessage  = GraalSavePromptMessage;
767               GraalSaveEditMode   = GRAAL_EDIT_MEASURE;
768               GraalSaveInputMode  = GRAAL_INPUT_HALF_BOX;
769               GraalCountEventZoom = 0;
770               GraalMaxEventZoom   = 0;
771 
772               GraalChangeCursorType( GraalLambdaEventEditX,
773                                      GraalLambdaEventEditY,
774                                      GraalCountEventEdit,
775                                      GraalInputMode );
776 
777               GraalComputeCursor( Event->x, Event->y );
778               GraalDisplayCursor();
779             }
780           }
781         }
782         else
783         {
784           if ( GraalCountEventEdit < GraalMaxEventEdit )
785           {
786             GraalLambdaEventEditX[ (int)GraalCountEventEdit ] = GraalLambdaCursorX;
787             GraalLambdaEventEditY[ (int)GraalCountEventEdit ] = GraalLambdaCursorY;
788 
789             GraalCountEventEdit = GraalCountEventEdit + 1;
790 
791             GraalPointCursor();
792 
793             if ( GraalCountEventEdit == GraalMaxEventEdit )
794             {
795               GraalTreatEventEdit();
796 
797               GraalDisplayCursor();
798             }
799           }
800         }
801 
802         GraalPromptMessage();
803 
804         break;
805 
806       case GRAAL_B3DN   :
807 
808         if ( GraalEditMode & GRAAL_ZOOM_MARK )
809         {
810           if ( GraalCountEventZoom != 0 )
811           {
812             GraalCountEventZoom = GraalCountEventZoom - 1;
813 
814             GraalResetCursor();
815           }
816           else
817           {
818             GraalChangeCursorType( GraalLambdaEventEditX,
819                                    GraalLambdaEventEditY,
820                                    GraalCountEventEdit,
821                                    GraalSaveInputMode );
822 
823             GraalInputMode          = GraalSaveInputMode;
824             GraalEditMode           = GraalSaveEditMode;
825             GraalPromptMessage      = GraalSavePromptMessage;
826             GraalSaveEditMode       = GRAAL_EDIT_MEASURE;
827             GraalSaveInputMode      = GRAAL_INPUT_HALF_BOX;
828             GraalSavePromptMessage  = GraalPromptEditMeasure;
829             GraalCountEventZoom     = 0;
830             GraalMaxEventZoom       = 0;
831           }
832         }
833         else
834         {
835           if ( GraalCountEventEdit != 0 )
836           {
837             GraalCountEventEdit = GraalCountEventEdit - 1;
838 
839             GraalResetCursor();
840           }
841           else
842           {
843             GraalEditUnselectAll();
844 
845             GraalChangeCursorType( NULL, NULL, 0,
846                                    GRAAL_INPUT_HALF_BOX );
847 
848             GraalInputMode      = GRAAL_INPUT_HALF_BOX;
849             GraalEditMode       = GRAAL_EDIT_MEASURE;
850             GraalPromptMessage  = GraalPromptEditMeasure;
851             GraalCountEventEdit = 0;
852             GraalMaxEventEdit   = 2;
853           }
854         }
855 
856         GraalPromptMessage();
857 
858         break;
859 
860       case GRAAL_MOTION :
861 
862         break;
863 
864       case GRAAL_ENTER  :
865 
866         GraalCursorInside = GRAAL_TRUE;
867         GraalDisplayCursor();
868 
869         break;
870 
871       case GRAAL_KEY_UP    : GraalZoomUp();
872 
873         break;
874 
875       case GRAAL_KEY_DN : GraalZoomDown();
876 
877         break;
878 
879       case GRAAL_KEY_LEFT : GraalZoomLeft();
880 
881         break;
882 
883       case GRAAL_KEY_RIGHT : GraalZoomRight();
884 
885         break;
886 
887       case GRAAL_KEY_MORE : GraalZoomMore();
888 
889         break;
890 
891       case GRAAL_KEY_LESS : GraalZoomLess();
892 
893         break;
894 
895       case GRAAL_KEY_FIT : GraalZoomFit();
896 
897         break;
898 
899       case GRAAL_KEY_REFRESH : GraalZoomRefresh();
900 
901         break;
902 
903       case GRAAL_KEY_UNZOOM : GraalZoomUndo();
904 
905         break;
906 
907       case GRAAL_KEY_ZOOM_IN :
908 
909          GraalChangeEditMode( GRAAL_ZOOM_IN, GraalPromptZoomIn );
910 
911         break;
912 
913       case GRAAL_KEY_CENTER :
914 
915          GraalChangeEditMode( GRAAL_ZOOM_CENTER, GraalPromptZoomCenter );
916 
917         break;
918 
919       case GRAAL_KEY_PAN :
920 
921          GraalChangeEditMode( GRAAL_ZOOM_PAN, GraalPromptZoomPan );
922 
923         break;
924 
925       case GRAAL_KEY_UP_LAYER :
926       case GRAAL_KEY_DN_LAYER :
927 
928         if ( ! ( GraalEditMode & GRAAL_ZOOM_MARK ) )
929         {
930           FlagUp = ( MouseEvent == GRAAL_KEY_UP_LAYER );
931 
932           switch ( GraalEditMode )
933           {
934             case GRAAL_CREATE_SEGMENT         :
935             case GRAAL_CREATE_SEGMENT_WIRE    : GraalChangeSegmentLayer( FlagUp );
936             break;
937 
938             case GRAAL_CREATE_VIA             : GraalChangeViaType( FlagUp );
939             break;
940 
941             case GRAAL_CREATE_BIGVIA          : GraalChangeBigViaType( FlagUp );
942             break;
943 
944             case GRAAL_CREATE_TRANSISTOR      :
945             case GRAAL_CREATE_TRANSISTOR_WIRE : GraalChangeTransistorType( FlagUp );
946             break;
947 
948             case GRAAL_CREATE_CONNECTOR       : GraalChangeConnectorLayer( FlagUp );
949             break;
950 
951             case GRAAL_CREATE_REFERENCE       : GraalChangeReferenceType( FlagUp );
952             break;
953           }
954 
955           GraalPromptMessage();
956         }
957 
958         break;
959     }
960 
961     if ( MouseEvent >= GRAAL_KEY_UP )
962     {
963       GraalComputeCursor( Event->x, Event->y );
964       GraalDisplayCursor();
965     }
966 
967     if ( ( OldLambdaCursorX != GraalLambdaCursorX ) ||
968          ( OldLambdaCursorY != GraalLambdaCursorY ) )
969     {
970       GraalDisplayCoordinates();
971       GraalDisplayCursor();
972     }
973   }
974 
975   rdsend();
976 }
977 
978 /*------------------------------------------------------------\
979 |                                                             |
980 |                       CallbackResize                        |
981 |                                                             |
982 \------------------------------------------------------------*/
983 
CallbackResize(MyWidget,ClientData,CallData)984 void CallbackResize( MyWidget, ClientData, CallData )
985 
986      Widget                       MyWidget;
987      XtPointer                    ClientData;
988      XmDrawingAreaCallbackStruct *CallData;
989 {
990   if ( GraalFirstExpose == GRAAL_FALSE )
991   {
992     rdsbegin();
993 
994     GraalSetMouseCursor( GraalGraphicWindow, GRAAL_WATCH_CURSOR );
995     GraalUndisplayCursor();
996 
997     GraalResizeGraphicWindow();
998     GraalRefreshGraphicWindow( 0, 0,
999                                GraalGraphicDx, GraalGraphicDy );
1000     GraalSetMouseCursor( GraalGraphicWindow, GRAAL_NORMAL_CURSOR );
1001     GraalDisplayCursor();
1002 
1003     rdsend();
1004   }
1005 }
1006 
1007 /*------------------------------------------------------------\
1008 |                                                             |
1009 |                       CallbackExpose                        |
1010 |                                                             |
1011 \------------------------------------------------------------*/
1012 
CallbackExpose(MyWidget,ClientData,CallData)1013 void CallbackExpose( MyWidget, ClientData, CallData )
1014 
1015      Widget                       MyWidget;
1016      XtPointer                    ClientData;
1017      XmDrawingAreaCallbackStruct *CallData;
1018 {
1019   XExposeEvent *ExposeEvent;
1020 
1021   ExposeEvent = (XExposeEvent *)CallData->event;
1022 
1023   rdsbegin();
1024 
1025   if ( GraalFirstExpose == GRAAL_TRUE )
1026   {
1027     GraalFirstExpose = GRAAL_FALSE;
1028 
1029     GraalInitializeGraphicWindow();
1030     GraalUndisplayCursor();
1031 
1032     GraalLoadConfig( GRAAL_FALSE );
1033 
1034     if ( GraalFigureMbk != (phfig_list *)NULL )
1035     {
1036       GraalSetMouseCursor( GraalGraphicWindow, GRAAL_WATCH_CURSOR );
1037 
1038       GraalAddFigure();
1039       GraalChangeTopLevelTitle( GraalFigureMbk->NAME );
1040       GraalInitializeZoom();
1041       GraalDisplayToolsMessage();
1042       GraalDisplayFigure( 0, 0, GraalGraphicDx, GraalGraphicDy );
1043       GraalSetMouseCursor( GraalGraphicWindow, GRAAL_NORMAL_CURSOR );
1044     }
1045     else
1046     {
1047       GraalChangeTopLevelTitle( (char *)NULL );
1048     }
1049 
1050     GraalRefreshGraphicWindow( 0, 0, GraalGraphicDx, GraalGraphicDy );
1051     GraalDisplayCursor();
1052 
1053     /* LUDO: Fed up to Click On IT ...
1054     GraalEnterPresentPanel();
1055     */
1056   }
1057   else
1058   {
1059     GraalUndisplayCursor();
1060     GraalRefreshGraphicWindow( ExposeEvent->x, ExposeEvent->y,
1061                                ExposeEvent->width, ExposeEvent->height );
1062     GraalDisplayCursor();
1063   }
1064 
1065   rdsend();
1066 }
1067 
1068 /*------------------------------------------------------------\
1069 |                                                             |
1070 |                     GraalInitializeEvent                    |
1071 |                                                             |
1072 \------------------------------------------------------------*/
1073 
GraalInitializeEvent()1074 void GraalInitializeEvent()
1075 
1076 {
1077   XtActionsRec NewActions;
1078 
1079   rdsbegin();
1080 
1081   XtVaSetValues( GraalGraphicWindow,
1082                  XmNtranslations,
1083                  XtParseTranslationTable( GraalEventTranslation ),
1084                  NULL
1085                );
1086 
1087   NewActions.string = "CallbackEvent";
1088   NewActions.proc   =  CallbackEvent;
1089 
1090   XtAppAddActions( GraalApplication, &NewActions, 1 );
1091 
1092   XtAddCallback( GraalGraphicWindow,
1093                  XmNresizeCallback,
1094                  CallbackResize, NULL );
1095 
1096   XtAddCallback( GraalGraphicWindow,
1097                  XmNexposeCallback,
1098                  CallbackExpose, NULL );
1099 
1100   rdsend();
1101 }
1102