Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / yagle / xyagle / XTB_dialog.c
1 /*------------------------------------------------------------\
2 | |
3 | Tool : XYAG |
4 | |
5 | File : dialog.c |
6 | |
7 | Authors : Jacomme Ludovic |
8 | Lester Anthony |
9 | |
10 \------------------------------------------------------------*/
11
12 #include <stdlib.h>
13 #include <Xm/Xm.h>
14 #include <Xm/FileSB.h>
15 #include <Xm/MessageB.h>
16 #include <Xm/SelectioB.h>
17 #include <Xm/SeparatoG.h>
18
19 #include MUT_H
20 #include MLO_H
21 #include XTB_H
22 #include XSB_H
23 #include XMX_H
24 #include XMV_H
25 #include XME_H
26 #include XMT_H
27
28 #include "XTB_dialog.h"
29 #include "XME_search.h"
30 #include "XYA_error.h"
31 #include "XMV_view.h"
32 #include "XMF_file.h"
33
34 Widget XyagFileSelectDialog = NULL;
35
36 static int XyagLockLoop = 0;
37
38 static void CallbackConfirmQuitOk();
39 static void CallbackZoomSetOk();
40 static void CallbackFindOk();
41 static void CallbackDepthSetOk();
42 static void CallbackDepthSetToggle();
43
44 static void
45 simple_callback(dialog, client_data, cbs)
46 Widget dialog;
47 XtPointer client_data;
48 XmAnyCallbackStruct *cbs;
49 {
50 XtUnmanageChild(dialog);
51 }
52
53 /*------------------------------------------------------------\
54 | XyagDestroyDialogCallback |
55 \------------------------------------------------------------*/
56
57 void
58 XyagDestroyDialogCallback(MyWidget, ClientData, CallData)
59 Widget MyWidget;
60 caddr_t ClientData;
61 caddr_t CallData;
62 {
63 XyagLockLoop = 0;
64 XyagExitErrorMessage(1);
65 XyagExit(1);
66 }
67
68 /*------------------------------------------------------------\
69 | XyagExitDialogCallback |
70 \------------------------------------------------------------*/
71
72 void
73 XyagExitDialogCallback()
74 {
75 XyagLockLoop = 0;
76 }
77
78 /*------------------------------------------------------------\
79 | XyagLimitedLoop |
80 \------------------------------------------------------------*/
81
82 void
83 XyagLimitedLoop(MyWidget)
84 Widget MyWidget;
85 {
86 Widget DialogShell, WShell;
87 XEvent Event;
88 XAnyEvent *AnyEvent;
89 XtAppContext Context;
90
91 Context = XtWidgetToApplicationContext(MyWidget);
92
93 XyagLockLoop = 1;
94
95 // XyagSetMouseCursor(XtParent(MyWidget),XYAG_PIRATE_CURSOR);
96
97 for (WShell = MyWidget; !XtIsShell(WShell); WShell = XtParent(WShell));
98
99 while (XyagLockLoop == 1) {
100 XtAppNextEvent(Context, &Event);
101
102 AnyEvent = (XAnyEvent *) (&Event);
103
104 for (DialogShell = XtWindowToWidget(AnyEvent->display, AnyEvent->window);
105 ((DialogShell != NULL) && (!XtIsShell(DialogShell)));
106 DialogShell = XtParent(DialogShell));
107
108 switch (AnyEvent->type) {
109 case KeyRelease:
110 case ButtonRelease:
111 if (WShell == DialogShell) {
112 XtDispatchEvent(&Event);
113 }
114 break;
115
116 case KeyPress:
117 case ButtonPress:
118 if (WShell != DialogShell) {
119 //AnyEvent->window = XtWindow(WShell);
120 XtPopup( WShell, XtGrabNone );
121 }
122 else
123 {
124 XtDispatchEvent( &Event );
125 }
126 break;
127
128 default:
129 XtDispatchEvent(&Event);
130 }
131 }
132
133 XyagLockLoop = 1;
134
135 XyagSetMouseCursor( MyWidget, XYAG_NORMAL_CURSOR );
136
137 }
138 /*------------------------------------------------------------\
139 | XyagLeaveLimitedLoop |
140 \------------------------------------------------------------*/
141 void XyagLeaveLimitedLoop()
142 {
143 XyagLockLoop = 0;
144 }
145
146
147 /*------------------------------------------------------------\
148 | XyagWarningMessage |
149 \------------------------------------------------------------*/
150
151 void
152 XyagWarningMessage(Father, Subject)
153 Widget Father;
154 char *Subject;
155 {
156 static Widget dialog;
157 XmString label, title;
158 Arg args[9];
159 int n = 0;
160 char buffer[256];
161
162 label = XmStringCreateSimple(Subject);
163
164 if (!dialog) {
165 sprintf(buffer,"%s: Warning",XYAGLE_NAME);
166 title = XmStringCreateSimple(buffer);
167 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
168 n++;
169 XtSetArg(args[n], XmNmessageString, label);
170 n++;
171 dialog = XmCreateWarningDialog(Father, "warningDialog", args, n);
172 XtVaSetValues(dialog, XmNdialogTitle, title, NULL);
173 XtAddCallback(dialog, XmNokCallback, simple_callback, NULL);
174 XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON));
175 XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
176 }
177 else {
178 XtVaSetValues(dialog, XmNmessageString, label, NULL);
179 }
180
181 XmStringFree(label);
182 XtManageChild(dialog);
183 }
184
185 /*------------------------------------------------------------\
186 | XyagErrorMessage |
187 \------------------------------------------------------------*/
188
189 void
190 XyagErrorMessage(Father, Subject)
191 Widget Father;
192 char *Subject;
193 {
194 static Widget errorDialog;
195 XmString label, title;
196 Arg args[9];
197 int n = 0;
198 char buffer[256];
199
200 label = XmStringCreateSimple(Subject);
201
202 if (!errorDialog) {
203 sprintf(buffer,"%s: Error",XYAGLE_NAME);
204 title = XmStringCreateSimple(buffer);
205 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
206 n++;
207 XtSetArg(args[n], XmNmessageString, label);
208 n++;
209 errorDialog = XmCreateErrorDialog(Father, "errorDialog", args, n);
210 XtVaSetValues(errorDialog, XmNdialogTitle, title, NULL);
211 XtAddCallback(errorDialog, XmNokCallback, simple_callback, NULL);
212 XtUnmanageChild(XmMessageBoxGetChild(errorDialog, XmDIALOG_CANCEL_BUTTON));
213 XtUnmanageChild(XmMessageBoxGetChild(errorDialog, XmDIALOG_HELP_BUTTON));
214 }
215 else {
216 XtVaSetValues(errorDialog, XmNmessageString, label, NULL);
217 }
218
219 XmStringFree(label);
220 XtManageChild(errorDialog);
221 }
222
223 /*------------------------------------------------------------\
224 | XyagWorkingDialog |
225 \------------------------------------------------------------*/
226
227 Widget
228 XyagWorkingDialog(Father, Subject)
229 Widget Father;
230 char *Subject;
231 {
232 static Widget workingDialog;
233 XmString label, title;
234 Arg args[9];
235 int n = 0;
236 char buffer[256];
237
238 label = XmStringCreateSimple(Subject);
239
240 if (!workingDialog) {
241 sprintf(buffer,"%s: Working",XYAGLE_NAME);
242 title = XmStringCreateSimple(buffer);
243 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
244 n++;
245 XtSetArg(args[n], XmNmessageString, label);
246 n++;
247 workingDialog = XmCreateWorkingDialog(Father, "workingDialog", args, n);
248 XtVaSetValues(workingDialog, XmNdialogTitle, title, NULL);
249 XtAddCallback(workingDialog, XmNcancelCallback, simple_callback, NULL);
250 XtUnmanageChild(XmMessageBoxGetChild(workingDialog, XmDIALOG_OK_BUTTON));
251 XtUnmanageChild(XmMessageBoxGetChild(workingDialog, XmDIALOG_HELP_BUTTON));
252 }
253 else {
254 XtVaSetValues(workingDialog, XmNmessageString, label, NULL);
255 }
256
257 XmStringFree(label);
258 XtManageChild(workingDialog);
259 return workingDialog;
260 }
261
262
263 /*------------------------------------------------------------\
264 | XyagConfirmQuit |
265 \------------------------------------------------------------*/
266
267 void
268 XyagConfirmQuit()
269 {
270 static Widget quitDialog;
271 XmString label, title, yes, no;
272 Arg args[9];
273 int n = 0;
274 char buffer[256];
275
276
277 if (!quitDialog) {
278 sprintf(buffer,"%s: Confirm",XYAGLE_NAME);
279 title = XmStringCreateSimple(buffer);
280 sprintf(buffer,"Do you really want to quit %s?",XYAGLE_NAME);
281 label = XmStringCreateSimple(buffer);
282 yes = XmStringCreateSimple("YES");
283 no = XmStringCreateSimple("NO");
284 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); n++;
285 XtSetArg(args[n], XmNmessageString, label); n++;
286 XtSetArg(args[n], XmNokLabelString, yes); n++;
287 XtSetArg(args[n], XmNcancelLabelString, no); n++;
288 quitDialog = XmCreateQuestionDialog(XyagMainWindow, "confirmQuitDialog", args, n);
289 XtVaSetValues(quitDialog, XmNdialogTitle, title, NULL);
290 XtAddCallback(quitDialog, XmNokCallback, CallbackConfirmQuitOk, NULL);
291 XtAddCallback(quitDialog, XmNcancelCallback, simple_callback, NULL);
292 XtUnmanageChild(XmMessageBoxGetChild(quitDialog, XmDIALOG_HELP_BUTTON));
293 }
294
295 XtManageChild(quitDialog);
296 }
297
298
299 /*------------------------------------------------------------\
300 | CallbackConfirmQuitOk |
301 \------------------------------------------------------------*/
302
303 static void
304 CallbackConfirmQuitOk(MyWidget, ClientData, CallData)
305 Widget MyWidget;
306 caddr_t ClientData;
307 caddr_t CallData;
308 {
309 XtUnmanageChild(MyWidget);
310 XtCloseDisplay(XtDisplay(XtParent(MyWidget)));
311 XyagExitErrorMessage(0);
312 XyagExit(0);
313 }
314
315 /*------------------------------------------------------------\
316 | XyagZoomSet |
317 \------------------------------------------------------------*/
318
319 void
320 XyagZoomSet()
321 {
322 static Widget zoomSetDialog;
323 XmString label, title;
324 Arg args[9];
325 int n = 0;
326 char buffer[256];
327
328
329 if (!zoomSetDialog) {
330 sprintf(buffer,"%s: Prompt",XYAGLE_NAME);
331 title = XmStringCreateSimple(buffer);
332 label = XmStringCreateSimple("Enter the zoom percentage:");
333 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); n++;
334 XtSetArg(args[n], XmNselectionLabelString, label); n++;
335 XtSetArg(args[n], XmNautoUnmanage, False); n++;
336 zoomSetDialog = XmCreatePromptDialog(XyagMainWindow, "zoomSetDialog", args, n);
337 XtVaSetValues(zoomSetDialog, XmNdialogTitle, title, NULL);
338 XtAddCallback(zoomSetDialog, XmNokCallback, CallbackZoomSetOk, NULL);
339 XtAddCallback(zoomSetDialog, XmNcancelCallback, simple_callback, NULL);
340 XtUnmanageChild(XmSelectionBoxGetChild(zoomSetDialog, XmDIALOG_HELP_BUTTON));
341 }
342
343 XtManageChild(zoomSetDialog);
344 }
345
346 /*------------------------------------------------------------\
347 | CallbackZoomSetOk |
348 \------------------------------------------------------------*/
349
350 static void
351 CallbackZoomSetOk(MyWidget, ClientData, CallData)
352 Widget MyWidget;
353 caddr_t ClientData;
354 XmSelectionBoxCallbackStruct *CallData;
355 {
356 char *ZoomSet;
357 int ZoomPercent;
358
359 XmStringGetLtoR(CallData->value, XmSTRING_DEFAULT_CHARSET, &ZoomSet);
360
361 if (ZoomSet != NULL) {
362 ZoomPercent = atoi(ZoomSet);
363
364 if ((ZoomPercent < XYAG_PERCENT_ZOOM_MIN) || (ZoomPercent > XYAG_PERCENT_ZOOM_MAX)) {
365 XyagErrorMessage(XyagMainWindow, "The value must be between 5% and 95%");
366 }
367 else {
368 XyagPercentZoom = ZoomPercent;
369 XtUnmanageChild(MyWidget);
370 }
371 }
372 }
373
374 /*------------------------------------------------------------\
375 | XyagDepthSet |
376 \------------------------------------------------------------*/
377
378 void
379 XyagDepthSet()
380 {
381 static Widget depthSetDialog;
382 static Widget depthSetToggle;
383 XmString label, title;
384 XmString btn1, btn2, btn3;
385 Arg args[9];
386 int n = 0;
387 char buffer[256];
388
389 if (!depthSetDialog) {
390 sprintf(buffer,"%s: Prompt",XYAGLE_NAME);
391 title = XmStringCreateSimple(buffer);
392 label = XmStringCreateSimple("Enter depth for Hilite/Extract:");
393 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); n++;
394 XtSetArg(args[n], XmNselectionLabelString, label); n++;
395 XtSetArg(args[n], XmNautoUnmanage, False); n++;
396 depthSetDialog = XmCreatePromptDialog(XyagMainWindow, "depthSetDialog", args, n);
397 XtVaSetValues(depthSetDialog, XmNdialogTitle, title, NULL);
398 XtAddCallback(depthSetDialog, XmNokCallback, CallbackDepthSetOk, NULL);
399 XtAddCallback(depthSetDialog, XmNcancelCallback, simple_callback, NULL);
400 XtUnmanageChild(XmSelectionBoxGetChild(depthSetDialog, XmDIALOG_HELP_BUTTON));
401
402 btn1 = XmStringCreateSimple("Backwards");
403 btn2 = XmStringCreateSimple("Forwards");
404 btn3 = XmStringCreateSimple("Both Ways");
405 depthSetToggle = XmVaCreateSimpleRadioBox(depthSetDialog, "depthSetToggle", 0, CallbackDepthSetToggle,
406 XmVaRADIOBUTTON, btn1, 0, NULL, NULL,
407 XmVaRADIOBUTTON, btn2, 0, NULL, NULL,
408 XmVaRADIOBUTTON, btn3, 0, NULL, NULL,
409 NULL);
410 XtManageChild(depthSetToggle);
411 }
412
413 XtManageChild(depthSetDialog);
414 }
415
416 /*------------------------------------------------------------\
417 | CallbackDepthSetToggle |
418 \------------------------------------------------------------*/
419
420 static void
421 CallbackDepthSetToggle(MyWidget, ClientData, CallData)
422 Widget MyWidget;
423 caddr_t ClientData;
424 XmToggleButtonCallbackStruct *CallData;
425 {
426 if (CallData->set == False) return;
427 switch ((int)ClientData) {
428 case 0:
429 XyagDependencyMode = XYAG_BACKWARD;
430 break;
431 case 1:
432 XyagDependencyMode = XYAG_FORWARD;
433 break;
434 case 2:
435 XyagDependencyMode = XYAG_BOTH;
436 break;
437 }
438 }
439
440 /*------------------------------------------------------------\
441 | CallbackDepthSetOk |
442 \------------------------------------------------------------*/
443
444 static void
445 CallbackDepthSetOk(MyWidget, ClientData, CallData)
446 Widget MyWidget;
447 caddr_t ClientData;
448 XmSelectionBoxCallbackStruct *CallData;
449 {
450 char *DepthSet;
451 int DepthOfDep;
452
453 XmStringGetLtoR(CallData->value, XmSTRING_DEFAULT_CHARSET, &DepthSet);
454
455
456 if (DepthSet != NULL) {
457 if (!strcmp(DepthSet, "X\0")) {
458 XyagDepthOfDep = -2;
459 XtUnmanageChild(MyWidget);
460 }
461 else {
462 DepthOfDep = strtol(DepthSet, NULL, 10);
463 if (DepthOfDep <= 0) {
464 XyagErrorMessage(XyagMainWindow, "The Value must be strictly positive (or 'X' for MAX Depth)!");
465 }
466 else {
467 XyagDepthOfDep = DepthOfDep;
468 XtUnmanageChild(MyWidget);
469 }
470 }
471 }
472 else {
473 XyagErrorMessage(XyagMainWindow, "The Value must be strictly positive (or 'X' for MAX Depth)!");
474 }
475 }
476
477 /*------------------------------------------------------------\
478 | XyagFind |
479 \------------------------------------------------------------*/
480
481 void
482 XyagFind()
483 {
484 static Widget findDialog;
485 XmString label, title;
486 Arg args[9];
487 int n = 0;
488 char buffer[256];
489
490
491 if (!findDialog) {
492 sprintf(buffer,"%s: Prompt",XYAGLE_NAME);
493 title = XmStringCreateSimple(buffer);
494 label = XmStringCreateSimple("Enter gate or connector name:");
495 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); n++;
496 XtSetArg(args[n], XmNselectionLabelString, label); n++;
497 XtSetArg(args[n], XmNautoUnmanage, False); n++;
498 findDialog = XmCreatePromptDialog(XyagMainWindow, "findDialog", args, n);
499 XtVaSetValues(findDialog, XmNdialogTitle, title, NULL);
500 XtAddCallback(findDialog, XmNokCallback, CallbackFindOk, NULL);
501 XtAddCallback(findDialog, XmNcancelCallback, simple_callback, NULL);
502 XtUnmanageChild(XmSelectionBoxGetChild(findDialog, XmDIALOG_HELP_BUTTON));
503 }
504
505 XtManageChild(findDialog);
506 }
507
508 /*------------------------------------------------------------\
509 | CallbackFindOk |
510 \------------------------------------------------------------*/
511
512 static void
513 CallbackFindOk(MyWidget, ClientData, CallData)
514 Widget MyWidget;
515 caddr_t ClientData;
516 XmSelectionBoxCallbackStruct *CallData;
517 {
518 char *NameSet;
519
520 XmStringGetLtoR(CallData->value, XmSTRING_DEFAULT_CHARSET, &NameSet);
521 XtUnmanageChild(MyWidget);
522
523 NameSet = XyagPostTreatString(NameSet);
524
525 if (NameSet != (char *) NULL) {
526 NameSet = namealloc(NameSet);
527 XyagEditSearchObject(NameSet);
528 }
529 }
530
531 /*------------------------------------------------------------\
532 | XyagFileSelect |
533 \------------------------------------------------------------*/
534
535 void
536 XyagFileSelect(Filter, labelstr, callbackOk, labelExtraStr, callbackExtra)
537 XmString Filter;
538 char *labelstr;
539 void callbackOk();
540 char *labelExtraStr;
541 void callbackExtra();
542 {
543 static Widget fileSelectDialog;
544 XmString label, title, labelExtra;
545 Arg args[9];
546 int n = 0;
547 char buffer[256];
548
549
550 if (!fileSelectDialog) {
551 sprintf(buffer,"%s: File Select",XYAGLE_NAME);
552 title = XmStringCreateSimple(buffer);
553 label = XmStringCreateSimple(labelstr);
554 XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); n++;
555 XtSetArg(args[n], XmNselectionLabelString, label); n++;
556 XtSetArg(args[n], XmNautoUnmanage, False); n++;
557 fileSelectDialog = XmCreateFileSelectionDialog(XyagMainWindow, "fileSelectDialog", args, n);
558 XtVaSetValues(fileSelectDialog, XmNdialogTitle, title, NULL);
559 XtAddCallback(fileSelectDialog, XmNokCallback, callbackOk, NULL);
560 XtAddCallback(fileSelectDialog, XmNcancelCallback, simple_callback, NULL);
561 XtUnmanageChild(XmFileSelectionBoxGetChild(fileSelectDialog, XmDIALOG_FILTER_LABEL));
562 XtUnmanageChild(XmFileSelectionBoxGetChild(fileSelectDialog, XmDIALOG_FILTER_TEXT));
563 if (callbackExtra != NULL) {
564 XtAddCallback(fileSelectDialog, XmNhelpCallback, callbackExtra, NULL);
565 }
566 else {
567 XtUnmanageChild(XmSelectionBoxGetChild(fileSelectDialog, XmDIALOG_HELP_BUTTON));
568 }
569 if (labelExtraStr != NULL) {
570 labelExtra = XmStringCreateSimple(labelExtraStr);
571 XtVaSetValues(fileSelectDialog, XmNhelpLabelString, labelExtra, NULL);
572 XmStringFree(labelExtra);
573 }
574 }
575 else {
576 XtRemoveAllCallbacks(fileSelectDialog, XmNokCallback);
577 XtAddCallback(fileSelectDialog, XmNokCallback, callbackOk, NULL);
578 XtRemoveAllCallbacks(fileSelectDialog, XmNhelpCallback);
579 if (callbackExtra != NULL) {
580 XtManageChild(XmSelectionBoxGetChild(fileSelectDialog, XmDIALOG_HELP_BUTTON));
581 XtAddCallback(fileSelectDialog, XmNhelpCallback, callbackExtra, NULL);
582 }
583 else {
584 XtUnmanageChild(XmSelectionBoxGetChild(fileSelectDialog, XmDIALOG_HELP_BUTTON));
585 }
586 if (labelExtraStr != NULL) {
587 labelExtra = XmStringCreateSimple(labelExtraStr);
588 XtVaSetValues(fileSelectDialog, XmNhelpLabelString, labelExtra, NULL);
589 XmStringFree(labelExtra);
590 }
591 }
592 XtVaSetValues(fileSelectDialog, XmNpattern, Filter, NULL);
593
594 XtManageChild(fileSelectDialog);
595 }
596