restructured so that one can add a vi widget anywhere.
[nvi.git] / motif_l / m_options.c
blobf9e3c3b816777f7d4f1d3641b2e341972a565849
1 /*-
2 * Copyright (c) 1996
3 * Rob Zimmermann. All rights reserved.
4 * Copyright (c) 1996
5 * Keith Bostic. All rights reserved.
7 * See the LICENSE file for redistribution information.
8 */
10 #include "config.h"
12 #ifndef lint
13 static const char sccsid[] = "$Id: m_options.c,v 8.2 1996/12/10 17:07:22 bostic Exp $ (Berkeley) $Date: 1996/12/10 17:07:22 $";
14 #endif /* not lint */
16 #include <X11/X.h>
17 #include <X11/Intrinsic.h>
18 #include <Xm/DialogS.h>
19 #include <Xm/Form.h>
20 #include <Xm/LabelG.h>
21 #include <Xm/PushBG.h>
22 #include <Xm/TextF.h>
23 #include <Xm/ToggleBG.h>
24 #include <Xm/RowColumn.h>
27 * Types
29 typedef enum {
30 optToggle,
31 optInteger,
32 optString,
33 optFile
34 } optKind;
36 typedef struct {
37 optKind kind;
38 String name;
39 void *value; /* really should get this from core */
40 } optData;
43 /* constants */
45 #if defined(SelfTest)
47 /* in production, get these from the resource list */
49 #define toggleColumns 6
50 #define intColumns 4
51 #define otherColumns 3
53 #endif
55 /* in production, get these from the resource list */
57 #define intWidth 10 /* characters */
58 #define otherWidth 18 /* characters */
62 * global data
65 static optData toggles[] = {
66 { optToggle, "altwerase", (void *) False },
67 { optToggle, "extended", (void *) False },
68 { optToggle, "mesg", (void *) True },
69 { optToggle, "ruler", (void *) False },
70 { optToggle, "tildeop", (void *) False },
71 { optToggle, "autoindent", (void *) True },
72 { optToggle, "modeline", (void *) False },
73 { optToggle, "timeout", (void *) True },
74 { optToggle, "autoprint", (void *) True },
75 { optToggle, "flash", (void *) True },
76 { optToggle, "searchincr", (void *) True },
77 { optToggle, "ttywerase", (void *) False },
78 { optToggle, "autowrite", (void *) False },
79 { optToggle, "secure", (void *) False },
80 { optToggle, "verbose", (void *) False },
81 { optToggle, "iclower", (void *) False },
82 { optToggle, "number", (void *) False },
83 { optToggle, "warn", (void *) True },
84 { optToggle, "beautify", (void *) False },
85 { optToggle, "ignorecase", (void *) True },
86 { optToggle, "octal", (void *) False },
87 { optToggle, "showmatch", (void *) False },
88 { optToggle, "open", (void *) True },
89 { optToggle, "showmode", (void *) False },
90 { optToggle, "windowname", (void *) False },
91 { optToggle, "leftright", (void *) False },
92 { optToggle, "optimize", (void *) True },
93 { optToggle, "slowopen", (void *) False },
94 { optToggle, "comment", (void *) False },
95 { optToggle, "lisp", (void *) False },
96 { optToggle, "prompt", (void *) True },
97 { optToggle, "sourceany", (void *) False },
98 { optToggle, "wrapscan", (void *) True },
99 { optToggle, "edcompatible", (void *) False },
100 { optToggle, "list", (void *) False },
101 { optToggle, "readonly", (void *) False },
102 { optToggle, "writeany", (void *) False },
103 { optToggle, "lock", (void *) True },
104 { optToggle, "redraw", (void *) False },
105 { optToggle, "errorbells", (void *) False },
106 { optToggle, "magic", (void *) True },
107 { optToggle, "remap", (void *) True },
108 { optToggle, "exrc", (void *) False },
109 { optToggle, "terse", (void *) False },
112 static optData ints[] = {
113 { optInteger, "scroll", (void *) "11" },
114 { optInteger, "hardtabs", (void *) "0" },
115 { optInteger, "shiftwidth", (void *) "4" },
116 { optInteger, "window", (void *) "23" },
117 { optInteger, "keytime", (void *) "6" },
118 { optInteger, "sidescroll", (void *) "16" },
119 { optInteger, "wraplen", (void *) "0" },
120 { optInteger, "columns", (void *) "80" },
121 { optInteger, "lines", (void *) "24" },
122 { optInteger, "wrapmargin", (void *) "0" },
123 { optInteger, "tabstop", (void *) "8" },
124 { optInteger, "escapetime", (void *) "1" },
125 { optInteger, "taglength", (void *) "0" },
126 { optInteger, "matchtime", (void *) "7" },
127 { optInteger, "report", (void *) "5" },
130 static optData others[] = {
131 { optString, "filec", (void *) "^[" },
132 { optString, "msgcat", (void *) "./" },
133 { optString, "noprint", (void *) "" },
134 { optString, "backup", (void *) "" },
135 { optString, "cdpath", (void *) ":" },
136 { optString, "cedit", (void *) "" },
137 { optString, "print", (void *) "" },
138 { optString, "term", (void *) "motif" },
139 { optFile, "directory", (void *) "/tmp" },
140 { optString, "paragraphs", (void *) "IPLPPPQPP LIpplpipbp" },
141 { optString, "path", (void *) "src:include:/debugger/src:/debugger/include/" },
142 { optFile, "recdir", (void *) "/var/tmp/vi.recover" },
143 { optString, "sections", (void *) "NHSHH HUnhsh" },
144 { optFile, "shell", (void *) "/bin/csh" },
145 { optString, "shellmeta", (void *) "~{[*?$`'\"\\" },
146 { optString, "tags", (void *) "tags /debugger/tmp/tags10 /debugger/tags /debugger/lib/tags" },
150 /* callbacks */
152 #if defined(__STDC__)
153 static void change_toggle( Widget w, optData *option )
154 #else
155 static void change_toggle( w, option )
156 Widget w;
157 optData *option;
158 #endif
160 char buffer[1024];
161 Boolean set;
163 XtVaGetValues( w, XmNset, &set, 0 );
165 sprintf( buffer, ":set %s%s", (set) ? "" : "no", option->name );
167 #if defined(SelfTest)
168 printf( "sending command <<%s>>\n", buffer );
169 #else
170 _vi_send_command_string( buffer );
171 #endif
175 #if defined(__STDC__)
176 static void change_string( Widget w, optData *option )
177 #else
178 static void change_string( w, option )
179 Widget w;
180 optData *option;
181 #endif
183 char buffer[1024];
184 String str;
186 str = XmTextFieldGetString( w );
187 sprintf( buffer, ":set %s=%s", option->name, str );
189 #if defined(SelfTest)
190 printf( "sending command <<%s>>\n", buffer );
191 #else
192 _vi_send_command_string( buffer );
193 #endif
197 /* add a control to the property sheet */
199 #if defined(__STDC__)
200 static void add_toggle( Widget parent, optData *option )
201 #else
202 static void add_toggle( parent, option )
203 Widget parent;
204 optData *option;
205 #endif
207 Widget w;
209 w = XtVaCreateManagedWidget( option->name,
210 xmToggleButtonGadgetClass,
211 parent,
212 XmNset, (Boolean) option->value,
215 XtAddCallback( w, XmNvalueChangedCallback, change_toggle, option );
219 /* draw a matrix of text fields and their labels
220 * Note that rowcolumns widgets are column major, so we
221 * need to go through this nonsense rather than just adding the
222 * darn things in order
225 #define numRows(cols,count) ((2*(count)+(cols)-1)/(cols))
227 #if defined(__STDC__)
228 static void add_string_options( Widget parent,
229 optData *options,
230 int count,
231 int width
233 #else
234 static void add_string_options( parent, options, count, width )
235 Widget parent;
236 optData *options;
237 int count;
238 int width;
239 #endif
241 int i;
242 Widget f, w;
244 for ( i=0; i<count; i++ ) {
245 f = XtVaCreateWidget( "form",
246 xmFormWidgetClass,
247 parent,
250 w = XtVaCreateManagedWidget( options[i].name,
251 xmTextFieldWidgetClass,
253 #if defined(SelfTest)
254 XmNcolumns, width,
255 #endif
256 XmNtopAttachment, XmATTACH_FORM,
257 XmNbottomAttachment,XmATTACH_FORM,
258 XmNrightAttachment,XmATTACH_FORM,
261 XtVaCreateManagedWidget( options[i].name,
262 xmLabelGadgetClass,
264 XmNtopAttachment, XmATTACH_FORM,
265 XmNbottomAttachment, XmATTACH_FORM,
266 XmNleftAttachment, XmATTACH_FORM,
267 XmNrightAttachment, XmATTACH_WIDGET,
268 XmNrightWidget, w,
269 XmNalignment, XmALIGNMENT_END,
272 XmTextFieldSetString( w, (char *) options[i].value );
273 XtAddCallback( w, XmNactivateCallback, change_string, &options[i] );
274 XtManageChild( f );
280 /* Draw and display a dialog the describes nvi options */
282 #if defined(__STDC__)
283 static Widget create_options_dialog( Widget parent, String title )
284 #else
285 static Widget create_options_dialog( parent, title )
286 Widget parent;
287 String title;
288 #endif
290 Widget box, form, form2;
291 int i;
292 extern void _vi_cancel_cb();
294 box = XtVaCreatePopupShell( title,
295 xmDialogShellWidgetClass,
296 parent,
297 XmNtitle, title,
298 XmNallowShellResize, False,
301 XtAddCallback( box, XmNpopdownCallback, _vi_cancel_cb, 0 );
303 form = XtVaCreateWidget( "form",
304 xmRowColumnWidgetClass,
305 box,
309 form2 = XtVaCreateWidget( "toggleOptions",
310 xmRowColumnWidgetClass,
311 form,
312 XmNpacking, XmPACK_COLUMN,
313 #if defined(SelfTest)
314 XmNnumColumns, toggleColumns,
315 #endif
319 for (i=0; i<XtNumber(toggles); i++) {
320 add_toggle( form2, &toggles[i] );
322 XtManageChild( form2 );
324 form2 = XtVaCreateWidget( "intOptions",
325 xmRowColumnWidgetClass,
326 form,
327 XmNpacking, XmPACK_COLUMN,
328 #if defined(SelfTest)
329 XmNnumColumns, intColumns,
330 #endif
333 add_string_options( form2, ints, XtNumber(ints), intWidth );
334 XtManageChild( form2 );
336 form2 = XtVaCreateWidget( "otherOptions",
337 xmRowColumnWidgetClass,
338 form,
339 XmNpacking, XmPACK_COLUMN,
340 #if defined(SelfTest)
341 XmNnumColumns, otherColumns,
342 #endif
345 add_string_options( form2, others, XtNumber(others), otherWidth );
346 XtManageChild( form2 );
348 return form;
353 /* module entry point
354 * _vi_show_options_dialog( parent, title )
357 #if defined(__STDC__)
358 void _vi_show_options_dialog( Widget parent, String title )
359 #else
360 void _vi_show_options_dialog( parent, title )
361 Widget parent;
362 String title;
363 #endif
365 Widget db = create_options_dialog( parent, title ),
366 shell = XtParent(db);
367 Dimension height, width;
369 /* this one does not resize */
370 XtVaGetValues( shell, XmNheight, &height, XmNwidth, &width, 0 );
371 XtVaSetValues( shell, XmNminHeight, height, XmNminWidth, width,
372 XmNmaxHeight, height, XmNmaxWidth, width,
373 0 );
375 #if defined(SelfTest)
376 /* wait until it goes away */
377 XtPopup( shell, XtGrabNone );
378 #else
379 /* wait until it goes away */
380 _vi_modal_dialog( db );
381 #endif
386 #if defined(SelfTest)
388 #if XtSpecificationRelease == 4
389 #define ArgcType Cardinal *
390 #else
391 #define ArgcType int *
392 #endif
394 #if defined(__STDC__)
395 static void show_options( Widget w, XtPointer data, XtPointer cbs )
396 #else
397 static void show_options( w, data, cbs )
398 Widget w;
399 XtPointer data;
400 XtPointer cbs;
401 #endif
403 _vi_show_options_dialog( data, "Preferences" );
406 main( int argc, char *argv[] )
408 XtAppContext ctx;
409 Widget top_level, rc, button;
410 extern exit();
412 /* create a top-level shell for the window manager */
413 top_level = XtVaAppInitialize( &ctx,
414 argv[0],
415 NULL, 0, /* options */
416 (ArgcType) &argc,
417 argv, /* might get modified */
418 NULL,
419 NULL
422 rc = XtVaCreateManagedWidget( "rc",
423 xmRowColumnWidgetClass,
424 top_level,
428 button = XtVaCreateManagedWidget( "Pop up options dialog",
429 xmPushButtonGadgetClass,
433 XtAddCallback( button, XmNactivateCallback, show_options, rc );
435 button = XtVaCreateManagedWidget( "Quit",
436 xmPushButtonGadgetClass,
440 XtAddCallback( button, XmNactivateCallback, exit, 0 );
442 XtRealizeWidget(top_level);
443 XtAppMainLoop(ctx);
445 #endif