1 /******************************************************************************
2  * DESCRIPTION: Dinotrace source: customization requestor
3  *
4  * This file is part of Dinotrace.
5  *
6  * Author: Wilson Snyder <wsnyder@wsnyder.org>
7  *
8  * Code available from: http://www.veripool.org/dinotrace
9  *
10  ******************************************************************************
11  *
12  * Some of the code in this file was originally developed for Digital
13  * Semiconductor, a division of Digital Equipment Corporation.  They
14  * gratefuly have agreed to share it, and thus the bas version has been
15  * released to the public with the following provisions:
16  *
17  *
18  * This software is provided 'AS IS'.
19  *
20  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THE INFORMATION
21  * (INCLUDING ANY SOFTWARE) PROVIDED, INCLUDING ALL IMPLIED WARRANTIES OF
22  * MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE, AND
23  * NON-INFRINGEMENT. DIGITAL NEITHER WARRANTS NOR REPRESENTS THAT THE USE
24  * OF ANY SOURCE, OR ANY DERIVATIVE WORK THEREOF, WILL BE UNINTERRUPTED OR
25  * ERROR FREE.  In no event shall DIGITAL be liable for any damages
26  * whatsoever, and in particular DIGITAL shall not be liable for special,
27  * indirect, consequential, or incidental damages, or damages for lost
28  * profits, loss of revenue, or loss of use, arising out of or related to
29  * any use of this software or the information contained in it, whether
30  * such damages arise in contract, tort, negligence, under statute, in
31  * equity, at law or otherwise. This Software is made available solely for
32  * use by end users for information and non-commercial or personal use
33  * only.  Any reproduction for sale of this Software is expressly
34  * prohibited. Any rights not expressly granted herein are reserved.
35  *
36  ******************************************************************************
37  *
38  * Changes made over the basic version are covered by the GNU public licence.
39  *
40  * Dinotrace is free software; you can redistribute it and/or modify
41  * it under the terms of the GNU General Public License as published by
42  * the Free Software Foundation; either version 3, or (at your option)
43  * any later version.
44  *
45  * Dinotrace is distributed in the hope that it will be useful,
46  * but WITHOUT ANY WARRANTY; without even the implied warranty of
47  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
48  * GNU General Public License for more details.
49  *
50  * You should have received a copy of the GNU General Public License
51  * along with Dinotrace; see the file COPYING.  If not, write to
52  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
53  * Boston, MA 02111-1307, USA.
54  *
55  *****************************************************************************/
56 
57 #include "dinotrace.h"
58 
59 #include <Xm/FileSB.h>
60 #include <Xm/Form.h>
61 #include <Xm/RowColumn.h>
62 #include <Xm/PushB.h>
63 #include <Xm/PushBG.h>
64 #include <Xm/ToggleB.h>
65 #include <Xm/SelectioB.h>
66 #include <Xm/Text.h>
67 #include <Xm/Scale.h>
68 #include <Xm/RowColumn.h>
69 #include <Xm/RowColumnP.h>
70 #include <Xm/Label.h>
71 #include <Xm/LabelP.h>
72 #include <Xm/Form.h>
73 #include <Xm/BulletinB.h>
74 #include <Xm/Separator.h>
75 
76 #include "functions.h"
77 
78 static char *cus_write_text[CUSWRITEM_MAX]
79 = { "Comment out commands",
80     "Personal display preferences",
81     "Value searches",
82     "Cursors",
83     "Grids",
84     "File Format",
85     "Signal highlights/radix/notes",
86     "Signal ordering"};
87 
88 /***********************************************************************/
89 
90 
cus_dialog_cb(Widget w,Trace_t * trace,XmAnyCallbackStruct * cb)91 void cus_dialog_cb (
92     Widget	w,
93     Trace_t	*trace,
94     XmAnyCallbackStruct *cb)
95 {
96     char		title[MAXFNAMELEN + 15];
97 
98     if (DTPRINT_ENTRY) printf ("In custom - trace=%p\n",trace);
99 
100     if (!trace->custom.dialog) {
101 	if (trace->dfile.filename[0] == '\0')
102 	    sprintf (title,"Customize Window");
103 	else
104 	    sprintf (title,"Customize %s",trace->dfile.filename);
105 
106 	XtSetArg (arglist[0], XmNdefaultPosition, TRUE);
107 	XtSetArg (arglist[1], XmNdialogTitle, XmStringCreateSimple (title) );
108 	XtSetArg (arglist[2], XmNverticalSpacing, 7);
109 	XtSetArg (arglist[3], XmNhorizontalSpacing, 10);
110 	trace->custom.dialog = XmCreateFormDialog (trace->work,"customize",arglist,4);
111 
112 	/* Create radio box for page increment */
113 	trace->custom.page_menu = XmCreatePulldownMenu (trace->custom.dialog,"page",arglist,0);
114 
115 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple (" 1  Page"));
116 	trace->custom.page_item[0] = XmCreatePushButton (trace->custom.page_menu,"rpage",arglist,1);
117 	DManageChild (trace->custom.page_item[0], trace, MC_NOKEYS);
118 
119 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("1/2 Page"));
120 	trace->custom.page_item[1] = XmCreatePushButton (trace->custom.page_menu,"rpage",arglist,1);
121 	DManageChild (trace->custom.page_item[1], trace, MC_NOKEYS);
122 
123 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("1/4 Page"));
124 	trace->custom.page_item[2] = XmCreatePushButton (trace->custom.page_menu,"rpage",arglist,1);
125 	DManageChild (trace->custom.page_item[2], trace, MC_NOKEYS);
126 
127 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Page Increment") );
128 	XtSetArg (arglist[1], XmNsubMenuId, trace->custom.page_menu);
129 	XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_FORM );
130 	XtSetArg (arglist[3], XmNleftAttachment, XmATTACH_FORM );
131 	trace->custom.page_option = XmCreateOptionMenu (trace->custom.dialog,"options",arglist,4);
132 	DManageChild (trace->custom.page_option, trace, MC_NOKEYS);
133 
134 	/* Create radio box for time representation */
135 	trace->custom.time_menu = XmCreatePulldownMenu (trace->custom.dialog,"time",arglist,0);
136 
137 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Femtoseconds"));
138 	trace->custom.time_item[0] = XmCreatePushButton (trace->custom.time_menu,"rpage",arglist,1);
139 	DManageChild (trace->custom.time_item[0], trace, MC_NOKEYS);
140 
141 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Picoseconds"));
142 	trace->custom.time_item[1] = XmCreatePushButton (trace->custom.time_menu,"rpage",arglist,1);
143 	DManageChild (trace->custom.time_item[1], trace, MC_NOKEYS);
144 
145 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Nanoseconds"));
146 	trace->custom.time_item[2] = XmCreatePushButton (trace->custom.time_menu,"rpage",arglist,1);
147 	DManageChild (trace->custom.time_item[2], trace, MC_NOKEYS);
148 
149 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Microseconds"));
150 	trace->custom.time_item[3] = XmCreatePushButton (trace->custom.time_menu,"rpage",arglist,1);
151 	DManageChild (trace->custom.time_item[3], trace, MC_NOKEYS);
152 
153 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Grid #0 Cycles") );
154 	trace->custom.time_item[4] = XmCreatePushButton (trace->custom.time_menu,"rpage",arglist,1);
155 	DManageChild (trace->custom.time_item[4], trace, MC_NOKEYS);
156 
157 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Time represented in") );
158 	XtSetArg (arglist[1], XmNsubMenuId, trace->custom.time_menu);
159 	XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_WIDGET );
160 	XtSetArg (arglist[3], XmNtopWidget, trace->custom.page_option );
161 	XtSetArg (arglist[4], XmNleftAttachment, XmATTACH_FORM );
162 	trace->custom.time_option = XmCreateOptionMenu (trace->custom.dialog,"options",arglist,4);
163 	DManageChild (trace->custom.time_option, trace, MC_NOKEYS);
164 
165 	/* Create signal height slider */
166 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Signal Height"));
167 	XtSetArg (arglist[1], XmNx, 150);
168 	XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_WIDGET );
169 	XtSetArg (arglist[3], XmNtopWidget, trace->custom.time_option );
170 	trace->custom.sighgt_label = XmCreateLabel (trace->custom.dialog,"sighgtlabel",arglist,4);
171 	DManageChild (trace->custom.sighgt_label, trace, MC_NOKEYS);
172 
173 	XtSetArg (arglist[0], XmNshowValue, 1);
174 	XtSetArg (arglist[1], XmNx, 180);
175 	XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_WIDGET );
176 	XtSetArg (arglist[3], XmNtopWidget, trace->custom.sighgt_label );
177 	XtSetArg (arglist[4], XmNrightAttachment, XmATTACH_FORM );
178 	XtSetArg (arglist[5], XmNrightOffset, 10);
179 	XtSetArg (arglist[6], XmNminimum, 10);
180 	XtSetArg (arglist[7], XmNmaximum, 50);
181 	XtSetArg (arglist[8], XmNorientation, XmHORIZONTAL);
182 	XtSetArg (arglist[9], XmNprocessingDirection, XmMAX_ON_RIGHT);
183 	trace->custom.s1 = XmCreateScale (trace->custom.dialog,"sighgt",arglist,10);
184 	DManageChild (trace->custom.s1, trace, MC_NOKEYS);
185 
186 	/* Create click_to_edge button */
187 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Click To Edges"));
188 	XtSetArg (arglist[1], XmNx, 10);
189 	XtSetArg (arglist[2], XmNshadowThickness, 1);
190 	XtSetArg (arglist[3], XmNtopAttachment, XmATTACH_WIDGET );
191 	XtSetArg (arglist[4], XmNtopWidget, trace->custom.time_option );
192 	trace->custom.click_to_edge = XmCreateToggleButton (trace->custom.dialog,
193 							"click_to_edge",arglist,5);
194 	DManageChild (trace->custom.click_to_edge, trace, MC_NOKEYS);
195 
196 	/* Create RF button */
197 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Rise/Fall Time"));
198 	XtSetArg (arglist[1], XmNx, 10);
199 	XtSetArg (arglist[2], XmNshadowThickness, 1);
200 	XtSetArg (arglist[3], XmNtopAttachment, XmATTACH_WIDGET );
201 	XtSetArg (arglist[4], XmNtopWidget, dmanage_last );
202 	trace->custom.rfwid = XmCreateToggleButton (trace->custom.dialog,"rfwid",arglist,5);
203 	DManageChild (trace->custom.rfwid, trace, MC_NOKEYS);
204 
205 	/* Create cursor state on/off button */
206 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Cursors On/Off"));
207 	XtSetArg (arglist[1], XmNx, 10);
208 	XtSetArg (arglist[2], XmNshadowThickness, 1);
209 	XtSetArg (arglist[3], XmNtopAttachment, XmATTACH_WIDGET );
210 	XtSetArg (arglist[4], XmNtopWidget, dmanage_last );
211 	trace->custom.cursor_state = XmCreateToggleButton (trace->custom.dialog,
212 							   "cursor_state",arglist,5);
213 	DManageChild (trace->custom.cursor_state, trace, MC_NOKEYS);
214 
215 	/* Create prefix button */
216 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Draw common signal prefix"));
217 	XtSetArg (arglist[1], XmNx, 10);
218 	XtSetArg (arglist[2], XmNshadowThickness, 1);
219 	XtSetArg (arglist[3], XmNtopAttachment, XmATTACH_WIDGET );
220 	XtSetArg (arglist[4], XmNtopWidget, dmanage_last );
221 	trace->custom.prefixes = XmCreateToggleButton (trace->custom.dialog,"refreshing",arglist,5);
222 	DManageChild (trace->custom.prefixes, trace, MC_NOKEYS);
223 
224 	/* Create refresh button */
225 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Manual Refreshing"));
226 	XtSetArg (arglist[1], XmNx, 10);
227 	XtSetArg (arglist[2], XmNshadowThickness, 1);
228 	XtSetArg (arglist[3], XmNtopAttachment, XmATTACH_WIDGET );
229 	XtSetArg (arglist[4], XmNtopWidget, dmanage_last );
230 	trace->custom.refreshing = XmCreateToggleButton (trace->custom.dialog,"refreshing",arglist,5);
231 	DManageChild (trace->custom.refreshing, trace, MC_NOKEYS);
232 
233 	/* Ok/apply/cancel */
234 	ok_apply_cancel (&trace->custom.okapply, trace->custom.dialog,
235 			 dmanage_last,
236 			 (XtCallbackProc)cus_ok_cb, trace,
237 			 (XtCallbackProc)cus_apply_cb, trace,
238 			 NULL, NULL,
239 			 (XtCallbackProc)unmanage_cb, (Trace_t*)trace->custom.dialog);
240     }
241 
242     /* Update with current custom values */
243     switch (global->pageinc) {
244     case PAGEINC_FULL:
245 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.page_item[0]);
246 	break;
247     case PAGEINC_HALF:
248 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.page_item[1]);
249 	break;
250     case PAGEINC_QUARTER:
251 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.page_item[2]);
252 	break;
253     }
254     XtSetValues (trace->custom.page_option, arglist, 1);
255 
256     if (global->timerep == TIMEREP_PS)
257 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.time_item[0]);
258     else if (global->timerep == TIMEREP_FS)
259 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.time_item[1]);
260     else if (global->timerep == TIMEREP_NS)
261 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.time_item[2]);
262     else if (global->timerep == TIMEREP_US)
263 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.time_item[3]);
264     else
265 	XtSetArg (arglist[0], XmNmenuHistory, trace->custom.time_item[4]);
266     XtSetValues (trace->custom.time_option, arglist, 1);
267 
268     XtSetArg (arglist[0], XmNvalue, global->sighgt);
269     XtSetValues (trace->custom.s1,arglist,1);
270 
271     XmToggleButtonSetState (trace->custom.rfwid, global->sigrf, TRUE);
272     XmToggleButtonSetState (trace->custom.cursor_state, global->cursor_vis, TRUE);
273     XmToggleButtonSetState (trace->custom.click_to_edge, global->click_to_edge, TRUE);
274     XmToggleButtonSetState (trace->custom.refreshing, global->redraw_manually, TRUE);
275     XmToggleButtonSetState (trace->custom.refreshing, global->prefix_enable, TRUE);
276 
277     /* Do it */
278     DManageChild (trace->custom.dialog, trace, MC_NOKEYS);
279 }
280 
281 
cus_reread_cb(Widget w,Trace_t * trace,XmAnyCallbackStruct * cb)282 void cus_reread_cb (
283     Widget		w,
284     Trace_t		*trace,
285     XmAnyCallbackStruct	*cb)
286 {
287     if (DTPRINT_ENTRY) printf ("in cus_reread_cb trace=%p\n",trace);
288 
289     config_read_defaults (trace, FALSE);
290 
291     /* Reformat and refresh */
292     draw_all_needed ();
293 }
294 
cus_restore_cb(Widget w,Trace_t * trace,XmAnyCallbackStruct * cb)295 void	cus_restore_cb (
296     Widget		w,
297     Trace_t		*trace,
298     XmAnyCallbackStruct	*cb)
299 {
300     if (DTPRINT_ENTRY) printf ("in cus_restore_cb trace=%p\n",trace);
301 
302     /* do the default thing */
303     config_trace_defaults (trace);
304     config_global_defaults ();
305 
306     /* redraw the display */
307     draw_all_needed ();
308 }
309 
cus_ok_cb(Widget w,Trace_t * trace,XmAnyCallbackStruct * cb)310 void	cus_ok_cb (
311     Widget		w,
312     Trace_t		*trace,
313     XmAnyCallbackStruct	*cb)
314 {
315     int hgt;
316     Widget	clicked;
317 
318     if (DTPRINT_ENTRY) printf ("In cus_ok_cb - trace=%p\n",trace);
319 
320     XmScaleGetValue (trace->custom.s1, &hgt);
321     global->sighgt = hgt;
322     global->cursor_vis = XmToggleButtonGetState (trace->custom.cursor_state);
323     global->click_to_edge = XmToggleButtonGetState (trace->custom.click_to_edge);
324     global->redraw_manually = XmToggleButtonGetState (trace->custom.refreshing);
325     global->prefix_enable = XmToggleButtonGetState (trace->custom.prefixes);
326 
327     if (XmToggleButtonGetState (trace->custom.rfwid)) {
328 	if (!global->sigrf) global->sigrf = SIG_RF;
329     }
330     else global->sigrf = 0;
331 
332     XtSetArg (arglist[0], XmNmenuHistory, &clicked);
333     XtGetValues (trace->custom.time_option, arglist, 1);
334     if (clicked == trace->custom.time_item[4])
335 	global->timerep = TIMEREP_CYC;
336     else if (clicked == trace->custom.time_item[3])
337 	global->timerep = TIMEREP_US;
338     else if (clicked == trace->custom.time_item[2])
339 	global->timerep = TIMEREP_NS;
340     else if (clicked == trace->custom.time_item[1])
341 	global->timerep = TIMEREP_PS;
342     else global->timerep = TIMEREP_FS;
343 
344     XtSetArg (arglist[0], XmNmenuHistory, &clicked);
345     XtGetValues (trace->custom.page_option, arglist, 1);
346     if (clicked == trace->custom.page_item[2])
347 	global->pageinc = PAGEINC_QUARTER;
348     else if (clicked == trace->custom.page_item[1])
349 	global->pageinc = PAGEINC_HALF;
350     else global->pageinc = PAGEINC_FULL;
351 
352     /* hide the customize window */
353     XtUnmanageChild (trace->custom.dialog);
354 
355     /* res units may have changed, fix it & redraw the display */
356     new_res (trace, global->res);
357 
358     draw_needupd_sig_start ();	/* If prefix dropping changed */
359     draw_all_needed ();
360 }
361 
cus_apply_cb(Widget w,Trace_t * trace,XmAnyCallbackStruct * cb)362 void	cus_apply_cb (
363     Widget		w,
364     Trace_t		*trace,
365     XmAnyCallbackStruct	*cb)
366 {
367     if (DTPRINT_ENTRY) printf ("In cus_apply_cb - trace=%p\n",trace);
368 
369     /* Pretend an OK */
370     cus_ok_cb (w,trace,cb);
371 
372     /* manage the customize window */
373     DManageChild (trace->custom.dialog, trace, MC_NOKEYS);
374 }
375 
376 /****************************** File reading ******************************/
377 
cus_read_cb(Widget w,Trace_t * trace,XmFileSelectionBoxCallbackStruct * cb)378 void cus_read_cb (
379     Widget	w,
380     Trace_t	*trace,
381     XmFileSelectionBoxCallbackStruct *cb)
382 {
383     int		cfg_num;
384     Widget	last;
385 
386     if (DTPRINT_ENTRY) printf ("In cus_read_cb trace=%p\n",trace);
387 
388     if (!trace->cusread.dialog) {
389 	XtSetArg (arglist[0], XmNdefaultPosition, TRUE);
390 	XtSetArg (arglist[1], XmNdialogTitle, XmStringCreateSimple ("Read Dinotrace File") );
391 	trace->cusread.dialog = XmCreateFileSelectionDialog ( trace->main, "file", arglist, 2);
392 	DAddCallback (trace->cusread.dialog, XmNokCallback, cus_read_ok_cb, trace);
393 	DAddCallback (trace->cusread.dialog, XmNcancelCallback, unmanage_cb, trace->cusread.dialog);
394 	XtUnmanageChild ( XmFileSelectionBoxGetChild (trace->cusread.dialog, XmDIALOG_HELP_BUTTON));
395 
396 	XtSetArg (arglist[0], XmNhorizontalSpacing, 10);
397 	XtSetArg (arglist[1], XmNverticalSpacing, 7);
398 	trace->cusread.form = XmCreateForm (trace->cusread.dialog, "wa", arglist, 2);
399 
400 	/* Create label for this grid */
401 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("When reading a trace, read which .dino files?"));
402 	XtSetArg (arglist[1], XmNleftAttachment, XmATTACH_FORM );
403 	XtSetArg (arglist[2], XmNleftOffset, 25);
404 	XtSetArg (arglist[3], XmNtopAttachment, XmATTACH_FORM );
405 	trace->cusread.config_label = XmCreateLabel (trace->cusread.form,"label",arglist,5);
406 	DManageChild (trace->cusread.config_label, trace, MC_NOKEYS);
407 
408 	last = trace->cusread.config_label;
409 
410 	for (cfg_num=0; cfg_num<MAXCFGFILES; cfg_num++) {
411 	    /* enable button */
412 	    XtSetArg (arglist[0], XmNleftAttachment, XmATTACH_FORM );
413 	    XtSetArg (arglist[1], XmNtopAttachment, XmATTACH_WIDGET );
414 	    XtSetArg (arglist[2], XmNtopWidget, last);
415 	    XtSetArg (arglist[3], XmNleftOffset, 15);
416 	    XtSetArg (arglist[4], XmNlabelString, XmStringCreateSimple (" "));  /* Else openmotif makes small button*/
417 	    trace->cusread.config_enable[cfg_num] = XmCreateToggleButton (trace->cusread.form,"",arglist,5);
418 
419 	    /* file name */
420 	    XtSetArg (arglist[0], XmNrows, 1);
421 	    XtSetArg (arglist[1], XmNcolumns, 30);
422 	    XtSetArg (arglist[2], XmNleftAttachment, XmATTACH_WIDGET );
423 	    XtSetArg (arglist[3], XmNleftWidget, trace->cusread.config_enable[cfg_num]);
424 	    XtSetArg (arglist[4], XmNrightAttachment, XmATTACH_FORM );
425 	    XtSetArg (arglist[5], XmNtopAttachment, XmATTACH_WIDGET );
426 	    XtSetArg (arglist[6], XmNtopWidget, last);
427 	    XtSetArg (arglist[7], XmNresizeHeight, FALSE);
428 	    XtSetArg (arglist[8], XmNeditMode, XmSINGLE_LINE_EDIT);
429 	    XtSetArg (arglist[9], XmNsensitive, (cfg_num<3));
430 	    trace->cusread.config_filename[cfg_num] = XmCreateText (trace->cusread.form,"textn",arglist,9);
431 
432 	    DManageChild (trace->cusread.config_enable[cfg_num], trace, MC_NOKEYS);
433 	    DManageChild (trace->cusread.config_filename[cfg_num], trace, MC_NOKEYS);
434 
435 	    last = trace->cusread.config_enable[cfg_num];
436 	}
437 
438 	DManageChild (trace->cusread.form, trace, MC_NOKEYS);
439 
440 	XSync (global->display,0);
441 
442 	/* Set directory */
443 	XtSetArg (arglist[0], XmNdirectory, XmStringCreateSimple (global->directory) );
444 	XtSetValues (trace->cusread.dialog,arglist,1);
445 	fil_select_set_pattern (trace, trace->cusread.dialog, "*.dino");
446     }
447 
448     config_update_filenames (trace);
449     for (cfg_num=0; cfg_num<MAXCFGFILES; cfg_num++) {
450 	XmToggleButtonSetState (trace->cusread.config_enable[cfg_num], (global->config_enable[cfg_num]), TRUE);
451 	XmTextSetString (trace->cusread.config_filename[cfg_num], global->config_filename[cfg_num]);
452     }
453 
454     DManageChild (trace->cusread.dialog, trace, MC_NOKEYS);
455 
456     XSync (global->display,0);
457 }
458 
cus_read_ok_cb(Widget w,Trace_t * trace,XmFileSelectionBoxCallbackStruct * cb)459 void cus_read_ok_cb (
460     Widget	w,
461     Trace_t	*trace,
462     XmFileSelectionBoxCallbackStruct *cb)
463 {
464     char	*tmp;
465     char	filename[MAXFNAMELEN];
466     int		cfg_num;
467 
468     if (DTPRINT_ENTRY) printf ("In cus_read_ok_cb trace=%p\n",trace);
469 
470     XtUnmanageChild (trace->cusread.dialog);
471     XSync (global->display,0);
472 
473     for (cfg_num=0; cfg_num<MAXCFGFILES; cfg_num++) {
474 	global->config_enable[cfg_num] = XmToggleButtonGetState (trace->cusread.config_enable[cfg_num]);
475 	strcpy (global->config_filename[cfg_num], XmTextGetString (trace->cusread.config_filename[cfg_num]));
476     }
477 
478     tmp = extract_first_xms_segment (cb->value);
479     strcpy (filename, tmp);
480     DFree (tmp);
481     if (DTPRINT_FILE) printf ("In cus_read_ok_cb Filename=%s\n",trace->dfile.filename);
482 
483     config_read_file (trace, filename, TRUE, FALSE);
484 
485     /* Apply the statenames */
486     grid_calc_autos (trace);
487     draw_all_needed ();
488 }
489 
490 
491 /****************************** File writing ******************************/
492 
cus_write_cb(Widget w)493 void cus_write_cb (
494     Widget	w)
495 {
496     Trace_t *trace = widget_to_trace(w);
497     int		item_num;
498 
499     if (DTPRINT_ENTRY) printf ("In cus_write_cb trace=%p\n",trace);
500 
501     if (!trace->cuswr.dialog) {
502 	XtSetArg (arglist[0], XmNdefaultPosition, TRUE);
503 	XtSetArg (arglist[1], XmNdialogTitle, XmStringCreateSimple ("Write Dinotrace File") );
504 	trace->cuswr.dialog = XmCreateFileSelectionDialog ( trace->main, "file", arglist, 2);
505 	DAddCallback (trace->cuswr.dialog, XmNokCallback, cus_write_ok_cb, trace);
506 	DAddCallback (trace->cuswr.dialog, XmNcancelCallback, unmanage_cb, trace->cuswr.dialog);
507 	XtUnmanageChild ( XmFileSelectionBoxGetChild (trace->cuswr.dialog, XmDIALOG_HELP_BUTTON));
508 
509 	XtSetArg (arglist[0], XmNhorizontalSpacing, 10);
510 	XtSetArg (arglist[1], XmNverticalSpacing, 0);
511 	trace->cuswr.form = XmCreateForm (trace->cuswr.dialog, "wa", arglist, 2);
512 
513         /* Comment out button */
514 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Comment out commands"));
515         XtSetArg (arglist[1], XmNleftAttachment, XmATTACH_FORM );
516 	XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_FORM );
517 	XtSetArg (arglist[3], XmNtopOffset, 5);
518 	XtSetArg (arglist[4], XmNleftOffset, 5);
519 	trace->cuswr.item[CUSWRITEM_COMMENT] = XmCreateToggleButton (trace->cuswr.form,"",arglist,5);
520 	DManageChild (trace->cuswr.item[CUSWRITEM_COMMENT], trace, MC_NOKEYS);
521 
522 	/* Write global: */
523 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Write global:"));
524 	XtSetArg (arglist[1], XmNleftAttachment, XmATTACH_FORM );
525 	XtSetArg (arglist[2], XmNleftOffset, 8);
526 	XtSetArg (arglist[3], XmNtopAttachment, XmATTACH_WIDGET );
527 	XtSetArg (arglist[4], XmNtopWidget, dmanage_last );
528 	trace->cuswr.global_label = XmCreateLabel (trace->cuswr.form,"label",arglist,5);
529 	DManageChild (trace->cuswr.global_label, trace, MC_NOKEYS);
530 
531         /* Save personal preferences */
532 	for (item_num=CUSWRITEM_PERSONAL; item_num<=CUSWRITEM_CURSORS; item_num++) {
533 	   XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple (cus_write_text[item_num]));
534 	   XtSetArg (arglist[1], XmNleftAttachment, XmATTACH_FORM );
535 	   XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_WIDGET );
536 	   XtSetArg (arglist[3], XmNtopWidget, dmanage_last );
537 	   XtSetArg (arglist[4], XmNtopOffset, -5);
538 	   XtSetArg (arglist[5], XmNleftOffset, 20);
539 	   trace->cuswr.item[item_num] = XmCreateToggleButton (trace->cuswr.form,"",arglist,6);
540 	   DManageChild (trace->cuswr.item[item_num], trace, MC_NOKEYS);
541 	}
542 
543 	/* Begin pulldown */
544 	trace->cuswr.trace_pulldown = XmCreatePulldownMenu (trace->cuswr.form,"trace_pulldown",arglist,0);
545 
546 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("All Traces & Deleted") );
547 	trace->cuswr.trace_button[TRACESEL_ALLDEL] =
548 	  XmCreatePushButtonGadget (trace->cuswr.trace_pulldown,"pdbutton2",arglist,1);
549 	DManageChild (trace->cuswr.trace_button[TRACESEL_ALLDEL], trace, MC_NOKEYS);
550 
551 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("All Traces") );
552 	trace->cuswr.trace_button[TRACESEL_ALL] =
553 	    XmCreatePushButtonGadget (trace->cuswr.trace_pulldown,"pdbutton1",arglist,1);
554 	DManageChild (trace->cuswr.trace_button[TRACESEL_ALL], trace, MC_NOKEYS);
555 
556 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("This Trace") );
557 	trace->cuswr.trace_button[TRACESEL_THIS] =
558 	    XmCreatePushButtonGadget (trace->cuswr.trace_pulldown,"pdbutton0",arglist,1);
559 	DManageChild (trace->cuswr.trace_button[TRACESEL_THIS], trace, MC_NOKEYS);
560 
561 	XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple ("Write for") );
562 	XtSetArg (arglist[1], XmNsubMenuId, trace->cuswr.trace_pulldown);
563 	XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_WIDGET );
564 	XtSetArg (arglist[3], XmNtopWidget, trace->cuswr.item[CUSWRITEM_CURSORS] );
565 	XtSetArg (arglist[4], XmNleftAttachment, XmATTACH_FORM );
566 	trace->cuswr.trace_option = XmCreateOptionMenu (trace->cuswr.form,"options",arglist,5);
567 	DManageChild (trace->cuswr.trace_option, trace, MC_NOKEYS);
568 
569         /* Save trace preferences */
570 	for (item_num=CUSWRITEM_GRIDS; item_num<=CUSWRITEM_SIGORDER; item_num++) {
571 	   XtSetArg (arglist[0], XmNlabelString, XmStringCreateSimple (cus_write_text[item_num]));
572 	   XtSetArg (arglist[1], XmNleftAttachment, XmATTACH_FORM );
573 	   XtSetArg (arglist[2], XmNtopAttachment, XmATTACH_WIDGET );
574 	   XtSetArg (arglist[3], XmNtopWidget, dmanage_last );
575 	   XtSetArg (arglist[4], XmNtopOffset, -5);
576 	   XtSetArg (arglist[5], XmNleftOffset, 20);
577 	   trace->cuswr.item[item_num] = XmCreateToggleButton (trace->cuswr.form,"",arglist,6);
578 	   DManageChild (trace->cuswr.item[item_num], trace, MC_NOKEYS);
579 	}
580 
581 	DManageChild (trace->cuswr.form, trace, MC_NOKEYS);
582 
583 	XSync (global->display,0);
584 
585 	/* Set directory */
586 	XtSetArg (arglist[0], XmNdirectory, XmStringCreateSimple (global->directory) );
587 	XtSetValues (trace->cuswr.dialog,arglist,1);
588 	fil_select_set_pattern (trace, trace->cuswr.dialog, "*.dino");
589     }
590 
591     XtSetArg (arglist[0], XmNmenuHistory, trace->cuswr.trace_button[global->cuswr_traces]);
592     XtSetValues (trace->cuswr.trace_option, arglist, 1);
593 
594     for (item_num=0; item_num<CUSWRITEM_MAX; item_num++) {
595 	XmToggleButtonSetState (trace->cuswr.item[item_num],
596 				(global->cuswr_item[item_num]), TRUE);
597     }
598 
599     DManageChild (trace->cuswr.dialog, trace, MC_NOKEYS);
600 
601     XSync (global->display,0);
602 }
603 
cus_write_ok_cb(Widget w,Trace_t * trace,XmFileSelectionBoxCallbackStruct * cb)604 void cus_write_ok_cb (
605     Widget	w,
606     Trace_t	*trace,
607     XmFileSelectionBoxCallbackStruct *cb)
608 {
609     char	*tmp;
610     int item_num, i;
611     Widget	clicked;
612 
613     if (DTPRINT_ENTRY) printf ("In cus_write_ok_cb trace=%p\n",trace);
614 
615     XtUnmanageChild (trace->cuswr.dialog);
616 
617     tmp = extract_first_xms_segment (cb->value);
618     DFree (global->cuswr_filename);
619     global->cuswr_filename = strdup (tmp);
620     DFree (tmp);
621 
622     for (item_num=0; item_num<CUSWRITEM_MAX; item_num++) {
623         global->cuswr_item[item_num] = XmToggleButtonGetState (trace->cuswr.item[item_num]);
624     }
625 
626     XtSetArg (arglist[0], XmNmenuHistory, &clicked);
627     XtGetValues (trace->cuswr.trace_option, arglist, 1);
628     for (i=0; i<3; i++) {
629         if (clicked == trace->cuswr.trace_button[i]) {
630 	    global->cuswr_traces = (TraceSel_t)i;
631         }
632     }
633 
634     config_write_file (trace, global->cuswr_filename);
635 }
636 
637 
638