root / trunk / linux / dialogs.cpp

Revision 725, 115.6 kB (checked in by leo, 6 months ago)

Linux compile fixes.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// Linux Dialogs
2//
3
4#include <gtk/gtk.h>
5#include <gdk/gdkkeysyms.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <time.h>
9#include <sys/stat.h>
10#include <string.h>
11#include <unistd.h>
12#include <pwd.h>
13#include "opengl.h"
14#include "gtkmisc.h"
15#include "gtktools.h"
16#include "system.h"
17#include "dialogs.h"
18#include "typedefs.h"
19#include "globals.h"
20#include "piece.h"
21#include "group.h"
22#include "main.h"
23#include "config.h"
24//#include "message.h"
25#include "project.h"
26#include "lc_colors.h"
27
28// =============================================================================
29// Modal dialog helper functions
30
31void dialog_button_callback (GtkWidget *widget, gpointer data)
32{
33  GtkWidget *parent;
34  int *loop, *ret;
35
36  parent = gtk_widget_get_toplevel (widget);
37  loop = (int*)gtk_object_get_data (GTK_OBJECT (parent), "loop");
38  ret = (int*)gtk_object_get_data (GTK_OBJECT (parent), "ret");
39
40  *loop = 0;
41  *ret = GPOINTER_TO_INT (data);
42}
43
44gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
45{
46  int *loop;
47
48  gtk_widget_hide (widget);
49  loop = (int*)gtk_object_get_data (GTK_OBJECT (widget), "loop");
50  *loop = 0;
51
52  return TRUE;
53}
54
55// =============================================================================
56// MessageBox
57
58int msgbox_execute (const char* text, const char *caption, int flags)
59{
60  GtkWidget *window, *w, *vbox, *hbox;
61  GtkAccelGroup *group;
62  int mode = (flags & LC_MB_TYPEMASK), ret, loop = 1;
63  guint tmp_key;
64
65  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
66  gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (((GtkWidget*)(*main_window))));
67  gtk_signal_connect (GTK_OBJECT (window), "delete_event",
68                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
69  gtk_signal_connect (GTK_OBJECT (window), "destroy",
70                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
71  gtk_window_set_title (GTK_WINDOW (window), caption);
72  gtk_container_border_width (GTK_CONTAINER (window), 10);
73  gtk_object_set_data (GTK_OBJECT (window), "loop", &loop);
74  gtk_object_set_data (GTK_OBJECT (window), "ret", &ret);
75  gtk_widget_realize (window);
76
77  group = gtk_accel_group_new ();
78  gtk_window_add_accel_group (GTK_WINDOW (window), group);
79
80  vbox = gtk_vbox_new (FALSE, 10);
81  gtk_container_add (GTK_CONTAINER (window), vbox);
82  gtk_widget_show (vbox);
83 
84  w = gtk_label_new (text);
85  gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
86  gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
87  gtk_widget_show (w);
88 
89  w = gtk_hseparator_new ();
90  gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
91  gtk_widget_show (w);
92 
93  hbox = gtk_hbox_new (FALSE, 10);
94  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
95  gtk_widget_show (hbox);
96 
97  if (mode == LC_MB_OK)
98  {
99    w = gtk_button_new_with_label ("Ok");
100    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
101    gtk_signal_connect (GTK_OBJECT (w), "clicked",
102                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_OK));
103    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
104    gtk_widget_grab_default (w);
105    gtk_widget_show (w);
106    ret = LC_OK;
107  }
108  else if (mode == LC_MB_OKCANCEL)
109  {
110    w = gtk_button_new_with_label ("Ok");
111    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
112    gtk_signal_connect (GTK_OBJECT (w), "clicked",
113                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_OK));
114    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
115    gtk_widget_grab_default (w);
116    gtk_widget_show (w);
117
118    w = gtk_button_new_with_label ("Cancel");
119    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
120    gtk_signal_connect (GTK_OBJECT (w), "clicked",
121                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
122    gtk_widget_show (w);
123    ret = LC_CANCEL;
124  }
125  else if (mode == LC_MB_YESNOCANCEL)
126  {
127    w = gtk_button_new_with_label ("");
128    tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (w)->child), "_Yes");
129    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
130    gtk_signal_connect (GTK_OBJECT (w), "clicked",
131                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_YES));
132    gtk_widget_add_accelerator (w, "clicked", group, tmp_key, (GdkModifierType)0, (GtkAccelFlags)0);
133    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
134    gtk_widget_grab_default (w);
135    gtk_widget_show (w);
136    gtk_window_set_focus (GTK_WINDOW (window), w);
137
138    w = gtk_button_new_with_label ("");
139    tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (w)->child), "_No");
140    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
141    gtk_signal_connect (GTK_OBJECT (w), "clicked",
142                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_NO));
143    gtk_widget_add_accelerator (w, "clicked", group, tmp_key, (GdkModifierType)0, (GtkAccelFlags)0);
144    gtk_widget_show (w);
145
146    w = gtk_button_new_with_label ("");
147    tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (w)->child), "_Cancel");
148    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
149    gtk_signal_connect (GTK_OBJECT (w), "clicked",
150                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
151    gtk_widget_add_accelerator (w, "clicked", group, tmp_key, (GdkModifierType)0, (GtkAccelFlags)0);
152    gtk_widget_add_accelerator (w, "clicked", group, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0);
153    gtk_widget_show (w);
154    ret = LC_CANCEL;
155  }
156  else /* if (mode == LC_MB_YESNO) */
157  {
158    w = gtk_button_new_with_label ("Yes");
159    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
160    gtk_signal_connect (GTK_OBJECT (w), "clicked",
161                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_YES));
162    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
163    gtk_widget_grab_default (w);
164    gtk_widget_show (w);
165 
166    w = gtk_button_new_with_label ("No");
167    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
168    gtk_signal_connect (GTK_OBJECT (w), "clicked",
169                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_NO));
170    gtk_widget_show (w);
171    ret = LC_NO;
172  }
173
174  gtk_widget_show (window);
175  gtk_grab_add (window);
176
177  while (loop)
178    gtk_main_iteration ();
179
180  gtk_grab_remove (window);
181  gtk_widget_destroy (window);
182
183  return ret;
184}
185
186
187
188
189// =============================================================================
190
191
192
193
194// TODO: remove old functions and replace with the above ones
195static int def_ret = 0;
196static int* cur_ret = NULL;
197
198void dlg_end (int ret)
199{
200  *cur_ret = ret;
201}
202
203int dlg_domodal(GtkWidget* dlg, int def)
204{
205  int ret = -1, old_def = def_ret, *old_ret = cur_ret;
206  def_ret = def;
207  cur_ret = &ret;
208
209  gtk_widget_show(dlg);
210  gtk_grab_add(dlg);
211  while (ret == -1)
212    gtk_main_iteration ();
213  gtk_grab_remove(dlg);
214  gtk_widget_destroy(dlg);
215
216  cur_ret = old_ret;
217  def_ret = old_def;
218  return ret;
219}
220
221void dlg_default_callback(GtkWidget *widget, gpointer data)
222{
223  *cur_ret = GPOINTER_TO_INT(data);
224}
225
226gint dlg_delete_callback(GtkWidget *widget, GdkEvent* event, gpointer data)
227{
228  *cur_ret = def_ret;
229  return TRUE;
230}
231
232static bool read_float(GtkWidget* widget, float* value, float min_value, float max_value)
233{
234  char buf[256];
235
236  strcpy (buf, gtk_entry_get_text (GTK_ENTRY (widget)));
237  if (sscanf(buf, "%f", value) == 1)
238  {
239    if (*value >= min_value && *value <= max_value)
240      return true;
241  }
242
243  sprintf (buf, "Please enter a value between %g and %g", min_value, max_value);
244  msgbox_execute (buf, "LeoCAD", LC_MB_OK | LC_MB_ICONERROR);
245  gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(widget)), widget);
246
247  return false;
248}
249
250static void write_float(GtkWidget* widget, float value)
251{
252  char buf[16];
253  sprintf (buf, "%g", value);
254  gtk_entry_set_text (GTK_ENTRY (widget), buf);
255}
256
257static bool read_int(GtkWidget* widget, int* value, int min_value, int max_value)
258{
259  char buf[256];
260
261  strcpy (buf, gtk_entry_get_text (GTK_ENTRY (widget)));
262  if (sscanf(buf, "%d", value) == 1)
263  {
264    if (*value >= min_value && *value <= max_value)
265      return true;
266  }
267
268  sprintf (buf, "Please enter a value between %d and %d", min_value, max_value);
269  msgbox_execute (buf, "LeoCAD", LC_MB_OK | LC_MB_ICONERROR);
270  gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(widget)), widget);
271
272  return false;
273}
274
275static void write_int(GtkWidget* widget, int value)
276{
277  char buf[16];
278  sprintf (buf, "%d", value);
279  gtk_entry_set_text (GTK_ENTRY (widget), buf);
280}
281
282// File Open/Save/Merge dialog
283
284static char* filedlg_str;
285
286static void filedlg_callback(GtkWidget *widget, gpointer data)
287{
288  if (data != NULL)
289  {
290    *cur_ret = LC_OK;
291    strcpy(filedlg_str, gtk_file_selection_get_filename(GTK_FILE_SELECTION(data)));
292  }
293  else
294    *cur_ret = LC_CANCEL;
295}
296
297int filedlg_execute(const char* caption, char* filename)
298{
299  GtkWidget* dlg;
300  dlg = gtk_file_selection_new (caption);
301  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
302  filedlg_str = filename;
303
304  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(dlg)->ok_button),
305     "clicked", (GtkSignalFunc)filedlg_callback, dlg);
306  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(dlg)->cancel_button),
307     "clicked", (GtkSignalFunc)filedlg_callback, NULL);
308
309//    gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew),"penguin.png");
310
311  return dlg_domodal(dlg, LC_CANCEL);
312}
313
314// Color Selection Dialog
315
316static void colorseldlg_callback(GtkWidget *widget, gpointer data)
317{
318  if (data != NULL)
319  {
320    GtkWidget* dlg = gtk_widget_get_toplevel (widget);
321    double dbl[3];
322    float* color = (float*)data;
323
324    gtk_color_selection_get_color (GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), dbl);
325    color[0] = dbl[0];
326    color[1] = dbl[1];
327    color[2] = dbl[2];
328    *cur_ret = LC_OK;
329  }
330  else
331    *cur_ret = LC_CANCEL;
332}
333
334int colorseldlg_execute(void* param)
335{
336  float* color = (float*)param;
337  double dbl[3] = { color[0], color[1], color[2] };
338  GtkWidget* dlg;
339
340  dlg = gtk_color_selection_dialog_new ("Choose Color");
341  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
342  gtk_color_selection_set_color (GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), dbl);
343
344  gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button),
345     "clicked", (GtkSignalFunc)colorseldlg_callback, param);
346  gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button),
347     "clicked", (GtkSignalFunc)colorseldlg_callback, NULL);
348
349  return dlg_domodal(dlg, LC_CANCEL);
350}
351
352// Array Dialog
353
354typedef struct
355{
356  void* data;
357  GtkWidget *move_x, *move_y, *move_z;
358  GtkWidget *rotate_x, *rotate_y, *rotate_z;
359  GtkWidget *total;
360  GtkWidget *radio1, *radio2, *radio3;
361  GtkWidget *count1, *count2, *count3;
362  GtkWidget *offset_x2, *offset_y2, *offset_z2;
363  GtkWidget *offset_x3, *offset_y3, *offset_z3;
364} LC_ARRAYDLG_STRUCT;
365
366static void arraydlg_callback(GtkWidget *widget, gpointer data)
367{
368  LC_ARRAYDLG_STRUCT* s = (LC_ARRAYDLG_STRUCT*)data;
369  LC_ARRAYDLG_OPTS* opts = (LC_ARRAYDLG_OPTS*)s->data;
370
371  if (!read_float(s->move_x, &opts->fMove[0], -1000, 1000)) return;
372  if (!read_float(s->move_y, &opts->fMove[1], -1000, 1000)) return;
373  if (!read_float(s->move_z, &opts->fMove[2], -1000, 1000)) return;
374  if (!read_float(s->rotate_x, &opts->fRotate[0], -360, 360)) return;
375  if (!read_float(s->rotate_y, &opts->fRotate[1], -360, 360)) return;
376  if (!read_float(s->rotate_z, &opts->fRotate[2], -360, 360)) return;
377  if (!read_float(s->offset_x2, &opts->f2D[0], -1000, 1000)) return;
378  if (!read_float(s->offset_y2, &opts->f2D[1], -1000, 1000)) return;
379  if (!read_float(s->offset_z2, &opts->f2D[2], -1000, 1000)) return;
380  if (!read_float(s->offset_x3, &opts->f3D[0], -1000, 1000)) return;
381  if (!read_float(s->offset_y3, &opts->f3D[1], -1000, 1000)) return;
382  if (!read_float(s->offset_z3, &opts->f3D[2], -1000, 1000)) return;
383
384  int i;
385  if (!read_int(s->count1, &i, 1, 1000)) return;
386  opts->n1DCount = i;
387  if (!read_int(s->count2, &i, 1, 1000)) return;
388  opts->n2DCount = i;
389  if (!read_int(s->count3, &i, 1, 1000)) return;
390  opts->n3DCount = i;
391
392  if (GTK_TOGGLE_BUTTON (s->radio1)->active)
393    opts->nArrayDimension = 0;
394  if (GTK_TOGGLE_BUTTON (s->radio2)->active)
395    opts->nArrayDimension = 1;
396  if (GTK_TOGGLE_BUTTON (s->radio3)->active)
397    opts->nArrayDimension = 2;
398
399  *cur_ret = LC_OK;
400}
401
402static void arraydlg_adjtotal (GtkWidget *widget, gpointer data)
403{
404  LC_ARRAYDLG_STRUCT* s = (LC_ARRAYDLG_STRUCT*)data;
405  LC_ARRAYDLG_OPTS* opts = (LC_ARRAYDLG_OPTS*)s->data;
406  char ctot[11];
407
408  if (GTK_TOGGLE_BUTTON (s->radio1)->active)
409    opts->nArrayDimension = 0;
410  if (GTK_TOGGLE_BUTTON (s->radio2)->active)
411    opts->nArrayDimension = 1;
412  if (GTK_TOGGLE_BUTTON (s->radio3)->active)
413    opts->nArrayDimension = 2;
414
415  gint tot = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (s->count1)) *
416        ((opts->nArrayDimension > 0) ? gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(s->count2)) : 1) *
417        ((opts->nArrayDimension > 1) ? gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(s->count3)) : 1);
418
419  sprintf (ctot, "%i", tot);
420
421  gtk_entry_set_text (GTK_ENTRY (s->total), ctot);
422}
423
424static void arraydlg_radiotoggled (GtkWidget *widget, gpointer data)
425{
426  LC_ARRAYDLG_STRUCT* s = (LC_ARRAYDLG_STRUCT*)data;
427  LC_ARRAYDLG_OPTS* opts = (LC_ARRAYDLG_OPTS*)s->data;
428
429  if (GTK_TOGGLE_BUTTON (widget)->active == FALSE)
430    return;
431
432  arraydlg_adjtotal (widget, data);
433
434  if (opts->nArrayDimension > 0)
435  {
436    gtk_widget_set_sensitive (s->count2, TRUE);
437    gtk_widget_set_sensitive (s->offset_x2, TRUE);
438    gtk_widget_set_sensitive (s->offset_y2, TRUE);
439    gtk_widget_set_sensitive (s->offset_z2, TRUE);
440  }
441  else
442  {
443    gtk_widget_set_sensitive (s->count2, FALSE);
444    gtk_widget_set_sensitive (s->offset_x2, FALSE);
445    gtk_widget_set_sensitive (s->offset_y2, FALSE);
446    gtk_widget_set_sensitive (s->offset_z2, FALSE);
447  }
448
449  if (opts->nArrayDimension > 1)
450  {
451    gtk_widget_set_sensitive (s->count3, TRUE);
452    gtk_widget_set_sensitive (s->offset_x3, TRUE);
453    gtk_widget_set_sensitive (s->offset_y3, TRUE);
454    gtk_widget_set_sensitive (s->offset_z3, TRUE);
455  }
456  else
457  {
458    gtk_widget_set_sensitive (s->count3, FALSE);
459    gtk_widget_set_sensitive (s->offset_x3, FALSE);
460    gtk_widget_set_sensitive (s->offset_y3, FALSE);
461    gtk_widget_set_sensitive (s->offset_z3, FALSE);
462  }
463}
464
465int arraydlg_execute(void* param)
466{
467  GtkObject *adj;
468  GtkWidget *dlg;
469  GtkWidget *vbox1, *vbox2;
470  GtkWidget *hbox1, *hbox2;
471  GtkWidget *frame, *table, *label, *button;
472  GSList *radio_group = (GSList*)NULL;
473  LC_ARRAYDLG_STRUCT s;
474  s.data = param;
475
476  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
477  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
478  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
479              GTK_SIGNAL_FUNC (dlg_delete_callback), NULL);
480  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
481              GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
482  gtk_widget_set_usize (dlg, 450, 320);
483  gtk_window_set_title (GTK_WINDOW (dlg), "Array Options");
484  gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
485  gtk_widget_realize (dlg);
486
487  vbox1 = gtk_vbox_new (FALSE, 0);
488  gtk_widget_show (vbox1);
489  gtk_container_add (GTK_CONTAINER (dlg), vbox1);
490
491  hbox1 = gtk_hbox_new (FALSE, 0);
492  gtk_widget_show (hbox1);
493  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
494
495  frame = gtk_frame_new ("Transformation (Incremental)");
496  gtk_widget_show (frame);
497  gtk_box_pack_start (GTK_BOX (hbox1), frame, TRUE, TRUE, 0);
498  gtk_container_border_width (GTK_CONTAINER (frame), 10);
499
500  table = gtk_table_new (3, 4, FALSE);
501  gtk_widget_show (table);
502  gtk_container_add (GTK_CONTAINER (frame), table);
503  gtk_container_border_width (GTK_CONTAINER (table), 10);
504  gtk_table_set_col_spacings (GTK_TABLE (table), 20);
505
506  label = gtk_label_new ("X");
507  gtk_widget_show (label);
508  gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
509                    (GtkAttachOptions) 0, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
510
511  label = gtk_label_new ("Y");
512  gtk_widget_show (label);
513  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
514                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
515
516  label = gtk_label_new ("Z");
517  gtk_widget_show (label);
518  gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,
519                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
520
521  label = gtk_label_new ("Move");
522  gtk_widget_show (label);
523  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
524                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
525
526  adj = gtk_adjustment_new (0, -1000, 1000, 10, 10, 10);
527  s.move_x = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
528  gtk_widget_show (s.move_x);
529  gtk_table_attach (GTK_TABLE (table), s.move_x, 1, 2, 1, 2,
530                    (GtkAttachOptions) 0, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
531  gtk_widget_set_usize (s.move_x, 60, -2);
532 
533  adj = gtk_adjustment_new (0, -1000, 1000, 10, 10, 10);
534  s.move_y = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
535  gtk_widget_show (s.move_y);
536  gtk_table_attach (GTK_TABLE (table), s.move_y, 2, 3, 1, 2,
537                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
538  gtk_widget_set_usize (s.move_y, 60, -2);
539
540  adj = gtk_adjustment_new (0, -1000, 1000, 4, 12, 12);
541  s.move_z = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
542  gtk_widget_show (s.move_z);
543  gtk_table_attach (GTK_TABLE (table), s.move_z, 3, 4, 1, 2,
544                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
545  gtk_widget_set_usize (s.move_z, 60, -2);
546
547  label = gtk_label_new ("Rotate");
548  gtk_widget_show (label);
549  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
550                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
551
552  adj = gtk_adjustment_new (0, -180, 180, 1, 10, 10);
553  s.rotate_x = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
554  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (s.rotate_x), TRUE);
555  gtk_widget_show (s.rotate_x);
556  gtk_table_attach (GTK_TABLE (table), s.rotate_x, 1, 2, 2, 3,
557                    (GtkAttachOptions) 0, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
558  gtk_widget_set_usize (s.rotate_x, 60, -2);
559
560  adj = gtk_adjustment_new (0, -180, 180, 1, 10, 10);
561  s.rotate_y = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
562  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (s.rotate_y), TRUE);
563  gtk_widget_show (s.rotate_y);
564  gtk_table_attach (GTK_TABLE (table), s.rotate_y, 2, 3, 2, 3,
565                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
566  gtk_widget_set_usize (s.rotate_y, 60, -2);
567
568  adj = gtk_adjustment_new (0, -180, 180, 1, 10, 10);
569  s.rotate_z = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
570  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (s.rotate_z), TRUE);
571  gtk_widget_show (s.rotate_z);
572  gtk_table_attach (GTK_TABLE (table), s.rotate_z, 3, 4, 2, 3,
573                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
574  gtk_widget_set_usize (s.rotate_z, 60, -2);
575
576  vbox2 = gtk_vbox_new (FALSE, 0);
577  gtk_widget_show (vbox2);
578  gtk_box_pack_start (GTK_BOX (hbox1), vbox2, FALSE, FALSE, 0);
579  gtk_widget_set_usize (vbox2, 115, 142);
580
581  button = gtk_button_new_with_label ("OK");
582  gtk_widget_show (button);
583  gtk_signal_connect (GTK_OBJECT (button), "clicked",
584              GTK_SIGNAL_FUNC (arraydlg_callback), &s);
585  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
586  gtk_container_border_width (GTK_CONTAINER (button), 12);
587  GtkAccelGroup *accel_group = gtk_accel_group_new ();
588  gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
589  gtk_widget_add_accelerator (button, "clicked", accel_group,
590                              GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
591
592  button = gtk_button_new_with_label ("Cancel");
593  gtk_widget_show (button);
594  gtk_signal_connect (GTK_OBJECT (button), "clicked",
595              GTK_SIGNAL_FUNC (dlg_default_callback), GINT_TO_POINTER (LC_CANCEL));
596  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
597  gtk_container_border_width (GTK_CONTAINER (button), 12);
598  gtk_widget_add_accelerator (button, "clicked", accel_group,
599                              GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
600
601  hbox2 = gtk_hbox_new (FALSE, 0);
602  gtk_widget_show (hbox2);
603  gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0);
604
605  label = gtk_label_new ("Total:");
606  gtk_widget_show (label);
607  gtk_box_pack_start (GTK_BOX (hbox2), label, TRUE, TRUE, 0);
608
609  s.total = gtk_entry_new ();
610  gtk_widget_show (s.total);
611  gtk_box_pack_start (GTK_BOX (hbox2), s.total, TRUE, TRUE, 15);
612  gtk_widget_set_usize (s.total, 50, -2);
613  gtk_entry_set_editable (GTK_ENTRY (s.total), FALSE);
614
615  frame = gtk_frame_new ("Dimensions");
616  gtk_widget_show (frame);
617  gtk_box_pack_start (GTK_BOX (vbox1), frame, TRUE, TRUE, 5);
618  gtk_container_border_width (GTK_CONTAINER (frame), 10);
619
620  table = gtk_table_new (4, 5, FALSE);
621  gtk_widget_show (table);
622  gtk_container_add (GTK_CONTAINER (frame), table);
623  gtk_container_border_width (GTK_CONTAINER (table), 10);
624  gtk_table_set_col_spacings (GTK_TABLE (table), 20);
625
626  label = gtk_label_new ("Count");
627  gtk_widget_show (label);
628  gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
629            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
630
631  label = gtk_label_new ("Offsets");
632  gtk_widget_show (label);
633  gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
634            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
635
636  s.radio1 = gtk_radio_button_new_with_label (radio_group, "1D");
637  radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.radio1));
638  gtk_widget_show (s.radio1);
639  gtk_table_attach (GTK_TABLE (table), s.radio1, 0, 1, 1, 2,
640                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
641  gtk_signal_connect (GTK_OBJECT (s.radio1), "toggled",
642              GTK_SIGNAL_FUNC (arraydlg_radiotoggled), &s);
643
644  s.radio2 = gtk_radio_button_new_with_label (radio_group, "2D");
645  radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.radio2));
646  gtk_widget_show (s.radio2);
647  gtk_table_attach (GTK_TABLE (table), s.radio2, 0, 1, 2, 3,
648                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
649  gtk_signal_connect (GTK_OBJECT (s.radio2), "toggled",
650              GTK_SIGNAL_FUNC (arraydlg_radiotoggled), &s);
651
652  s.radio3 = gtk_radio_button_new_with_label (radio_group, "3D");
653  radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.radio3));
654  gtk_widget_show (s.radio3);
655  gtk_table_attach (GTK_TABLE (table), s.radio3, 0, 1, 3, 4,
656                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
657  gtk_signal_connect (GTK_OBJECT (s.radio3), "toggled",
658              GTK_SIGNAL_FUNC (arraydlg_radiotoggled), &s);
659
660  adj = gtk_adjustment_new (10, 1, 1000, 1, 10, 1);
661  s.count1 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
662  gtk_widget_show (s.count1);
663  gtk_table_attach (GTK_TABLE (table), s.count1, 1, 2, 1, 2,
664                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
665  gtk_widget_set_usize (s.count1, 60, -2);
666  gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
667              GTK_SIGNAL_FUNC (arraydlg_adjtotal), &s);
668
669  adj = gtk_adjustment_new (1, 1, 1000, 1, 10, 1);
670  s.count2 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
671  gtk_widget_show (s.count2);
672  gtk_table_attach (GTK_TABLE (table), s.count2, 1, 2, 2, 3,
673                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
674  gtk_widget_set_usize (s.count2, 60, -2);
675  gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
676              GTK_SIGNAL_FUNC (arraydlg_adjtotal), &s);
677
678  adj = gtk_adjustment_new (1, 1, 1000, 1, 10, 1);
679  s.count3 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
680  gtk_widget_show (s.count3);
681  gtk_table_attach (GTK_TABLE (table), s.count3, 1, 2, 3, 4,
682                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
683  gtk_widget_set_usize (s.count3, 60, -2);
684  gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
685              GTK_SIGNAL_FUNC (arraydlg_adjtotal), &s);
686
687  label = gtk_label_new ("X");
688  gtk_widget_show (label);
689  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
690                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
691
692  label = gtk_label_new ("Y");
693  gtk_widget_show (label);
694  gtk_table_attach (GTK_TABLE (table), label, 3, 4, 1, 2,
695                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
696
697  label = gtk_label_new ("Z");
698  gtk_widget_show (label);
699  gtk_table_attach (GTK_TABLE (table), label, 4, 5, 1, 2,
700                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
701
702  adj = gtk_adjustment_new (0, -1000, 1000, 10, 10, 10);
703  s.offset_x2 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
704  gtk_widget_show (s.offset_x2);
705  gtk_table_attach (GTK_TABLE (table), s.offset_x2, 2, 3, 2, 3,
706                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
707  gtk_widget_set_usize (s.offset_x2, 60, -2);
708
709  adj = gtk_adjustment_new (0, -1000, 1000, 10, 10, 10);
710  s.offset_y2 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
711  gtk_widget_show (s.offset_y2);
712  gtk_table_attach (GTK_TABLE (table), s.offset_y2, 3, 4, 2, 3,
713                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
714  gtk_widget_set_usize (s.offset_y2, 60, -2);
715
716  adj = gtk_adjustment_new (0, -1000, 1000, 4, 12, 10);
717  s.offset_z2 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
718  gtk_widget_show (s.offset_z2);
719  gtk_table_attach (GTK_TABLE (table), s.offset_z2, 4, 5, 2, 3,
720                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
721  gtk_widget_set_usize (s.offset_z2, 60, -2);
722
723  adj = gtk_adjustment_new (0, -1000, 1000, 10, 10, 10);
724  s.offset_x3 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
725  gtk_widget_show (s.offset_x3);
726  gtk_table_attach (GTK_TABLE (table), s.offset_x3, 2, 3, 3, 4,
727                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
728  gtk_widget_set_usize (s.offset_x3, 60, -2);
729
730  adj = gtk_adjustment_new (0, -1000, 1000, 10, 10, 10);
731  s.offset_y3 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
732  gtk_widget_show (s.offset_y3);
733  gtk_table_attach (GTK_TABLE (table), s.offset_y3, 3, 4, 3, 4,
734                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
735  gtk_widget_set_usize (s.offset_y3, 60, -2);
736
737  adj = gtk_adjustment_new (0, -1000, 1000, 4, 12, 10);
738  s.offset_z3 = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
739  gtk_widget_show (s.offset_z3);
740  gtk_table_attach (GTK_TABLE (table), s.offset_z3, 4, 5, 3, 4,
741                    (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
742  gtk_widget_set_usize (s.offset_z3, 60, -2);
743
744  // Initialize dialog
745  arraydlg_radiotoggled (s.radio1, &s);
746
747  return dlg_domodal(dlg, LC_CANCEL);
748}
749
750// =============================================================================
751// About Dialog
752
753int aboutdlg_execute (void* param)
754{
755#include "pixmaps/icon32.xpm"
756  GtkWidget *dlg, *vbox1, *vbox2, *hbox, *frame, *scr, *w;
757  GtkTextBuffer *buffer;
758  char info[512], buf[64];
759  GLboolean valueb;
760  GLint value;
761
762  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
763  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
764  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
765              GTK_SIGNAL_FUNC (dlg_delete_callback), NULL);
766  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
767              GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
768  gtk_window_set_title (GTK_WINDOW (dlg), "About LeoCAD");
769
770  gtk_widget_realize (dlg);
771
772  vbox1 = gtk_vbox_new (FALSE, 10);
773  gtk_widget_show (vbox1);
774  gtk_container_add (GTK_CONTAINER (dlg), vbox1);
775  gtk_container_border_width (GTK_CONTAINER (vbox1), 5);
776
777  hbox = gtk_hbox_new (FALSE, 5);
778  gtk_widget_show (hbox);
779  gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, TRUE, 0);
780
781  w = new_pixmap (dlg, icon32);
782  gtk_widget_show (w);
783  gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, TRUE, 0);
784  gtk_widget_set_usize (w, 32, 32);
785
786  vbox2 = gtk_vbox_new (TRUE, 0);
787  gtk_widget_show (vbox2);
788  gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 10);
789
790  w = gtk_label_new ("LeoCAD for "LC_VERSION_OSNAME" Version "LC_VERSION_TEXT);
791  gtk_widget_show (w);
792  gtk_box_pack_start (GTK_BOX (vbox2), w, FALSE, FALSE, 5);
793
794  w = gtk_label_new ("Copyright (c) 1996-2005, BT Software");
795  gtk_widget_show (w);
796  gtk_box_pack_start (GTK_BOX (vbox2), w, FALSE, FALSE, 5);
797
798  vbox2 = gtk_vbox_new (TRUE, 0);
799  gtk_widget_show (vbox2);
800  gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
801
802  w = gtk_button_new_with_label ("OK");
803  gtk_widget_show (w);
804  gtk_signal_connect (GTK_OBJECT (w), "clicked",
805              GTK_SIGNAL_FUNC (dlg_default_callback), GINT_TO_POINTER (LC_OK));
806  gtk_box_pack_start (GTK_BOX (vbox2), w, FALSE, FALSE, 5);
807  gtk_widget_set_usize (w, 60, -2);
808
809  gtk_widget_grab_focus (w);
810  GtkAccelGroup *accel_group = gtk_accel_group_new ();
811  gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
812  gtk_widget_add_accelerator (w, "clicked", accel_group,
813                              GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
814
815  frame = gtk_frame_new ("System Information");
816  gtk_widget_show (frame);
817  gtk_box_pack_start (GTK_BOX (vbox1), frame, TRUE, TRUE, 0);
818  gtk_widget_set_usize (frame, -2, 150);
819
820  vbox2 = gtk_vbox_new (FALSE, 0);
821  gtk_widget_show (vbox2);
822  gtk_container_add (GTK_CONTAINER (frame), vbox2);
823  gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
824
825  strcpy (info, "OpenGL Version ");
826  strcat (info, (const char*)glGetString (GL_VERSION));
827  strcat (info, "\n");
828  strcat (info, (const char*)glGetString (GL_RENDERER));
829  strcat (info, " - ");
830  strcat (info, (const char*)glGetString (GL_VENDOR));
831
832  strcat (info, "\n\nDisplay info:\n");
833  glGetIntegerv (GL_INDEX_BITS, &value);
834  sprintf (buf, "Bits per pixel: %i", value);
835  strcat (info, buf);
836  glGetIntegerv (GL_RED_BITS, &value);
837  sprintf (buf, " (%i", value);
838  strcat (info, buf);
839  glGetIntegerv (GL_GREEN_BITS, &value);
840  sprintf (buf, "-%i", value);
841  strcat (info, buf);
842  glGetIntegerv (GL_BLUE_BITS, &value);
843  sprintf (buf, "-%i", value);
844  strcat (info, buf);
845  glGetIntegerv (GL_ALPHA_BITS, &value);
846  sprintf (buf, "-%i)\n", value);
847  strcat (info, buf);
848  glGetIntegerv (GL_DEPTH_BITS, &value);
849  sprintf (buf, "Depth buffer bits: %i\n", value);
850  strcat (info, buf);
851  glGetIntegerv (GL_STENCIL_BITS, &value);
852  sprintf (buf, "Stencil bits: %i\n", value);
853  strcat (info, buf);
854  glGetIntegerv (GL_AUX_BUFFERS, &value);
855  sprintf (buf, "Auxillary buffers: %i\n", value);
856  strcat (info, buf);
857  glGetBooleanv (GL_STEREO, &valueb);
858  strcat (info, "Stereoscopic viewing: ");
859  if (valueb == GL_TRUE)
860    strcat (info, "Yes.\n");
861  else
862    strcat (info, "No.\n");
863
864  strcat (info, "Compiled Vertex Arrays: ");
865  if (GL_HasCompiledVertexArrays ())
866    strcat (info, "Supported.\n");
867  else
868    strcat (info, "Not supported.\n");
869
870  strcat (info, "Multitexturing: ");
871  if (GL_GetMultiTextures () > 1)
872  {
873    sprintf (buf, "Supported, %i texture units.\n", GL_GetMultiTextures ());
874    strcat (info, buf);
875  }
876  else
877    strcat (info, "Not supported.\n");
878  glGetIntegerv (GL_MAX_TEXTURE_SIZE, &value);
879  sprintf (buf, "Maximum texture size: %ix%i", value, value);
880  strcat (info, buf);
881
882  scr = gtk_scrolled_window_new (NULL, NULL);
883  gtk_widget_show (scr);
884  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
885  gtk_box_pack_start (GTK_BOX (vbox2), scr, TRUE, TRUE, 0);
886
887  w = gtk_text_view_new();
888  gtk_widget_show (w);
889  gtk_container_add (GTK_CONTAINER (scr), w);
890
891  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
892  gtk_text_buffer_set_text (buffer, info, -1);
893
894  //  if (GTK_TEXT (w)->vadj != NULL)
895  //    gtk_adjustment_set_value (GTK_ADJUSTMENT (GTK_TEXT (w)->vadj), 0);
896
897  return dlg_domodal(dlg, LC_OK);
898}
899
900// =============================================================================
901// HTML Dialog
902
903typedef struct
904{
905  void* data;
906  GtkWidget *single, *multiple, *index;
907  GtkWidget *list_end, *list_step, *images;
908  GtkWidget *highlight, *htmlext, *directory;
909} LC_HTMLDLG_STRUCT;
910
911static void htmldlg_ok(GtkWidget *widget, gpointer data)
912{
913  LC_HTMLDLG_STRUCT* s = (LC_HTMLDLG_STRUCT*)data;
914  LC_HTMLDLG_OPTS* opts = (LC_HTMLDLG_OPTS*)s->data;
915
916  opts->singlepage = (GTK_TOGGLE_BUTTON (s->single)->active) ? true : false;
917  opts->index = (GTK_TOGGLE_BUTTON (s->index)->active) ? true : false;
918  opts->images = (GTK_TOGGLE_BUTTON (s->images)->active) ? true : false;
919  opts->listend = (GTK_TOGGLE_BUTTON (s->list_end)->active) ? true : false;
920  opts->liststep = (GTK_TOGGLE_BUTTON (s->list_step)->active) ? true : false;
921  opts->highlight = (GTK_TOGGLE_BUTTON (s->highlight)->active) ? true : false;
922  opts->htmlext = (GTK_TOGGLE_BUTTON (s->htmlext)->active) ? true : false;
923  strcpy(opts->path, gtk_entry_get_text (GTK_ENTRY (s->directory)));
924
925  *cur_ret = LC_OK;
926}
927
928static void htmldlg_images (GtkWidget *widget, gpointer data)
929{
930  LC_HTMLDLG_STRUCT* s = (LC_HTMLDLG_STRUCT*)data;
931  LC_HTMLDLG_OPTS* opts = (LC_HTMLDLG_OPTS*)s->data;
932
933  imageoptsdlg_execute(&opts->imdlg ,true);
934}
935
936static void htmldlg_layout (GtkWidget *widget, gpointer data)
937{
938  LC_HTMLDLG_STRUCT* s = (LC_HTMLDLG_STRUCT*)data;
939
940  if (GTK_TOGGLE_BUTTON (s->single)->active)
941    gtk_widget_set_sensitive (s->index, FALSE);
942  else
943    gtk_widget_set_sensitive (s->index, TRUE);
944}
945
946static void htmldlg_list (GtkWidget *widget, gpointer data)
947{
948  LC_HTMLDLG_STRUCT* s = (LC_HTMLDLG_STRUCT*)data;
949
950  if (GTK_TOGGLE_BUTTON (s->list_end)->active ||
951      GTK_TOGGLE_BUTTON (s->list_step)->active)
952    gtk_widget_set_sensitive (s->images, TRUE);
953  else
954    gtk_widget_set_sensitive (s->images, FALSE);
955}
956
957int htmldlg_execute (void* param)
958{
959  GtkWidget *dlg;
960  GtkWidget *vbox, *vbox1, *vbox2, *hbox;
961  GtkWidget *frame, *label, *button;
962  GSList *radio_group = (GSList*)NULL;
963  LC_HTMLDLG_STRUCT s;
964  LC_HTMLDLG_OPTS* opts = (LC_HTMLDLG_OPTS*)param;
965  s.data = param;
966
967  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
968  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
969  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
970              GTK_SIGNAL_FUNC (dlg_delete_callback), NULL);
971  gtk_window_set_title (GTK_WINDOW (dlg), "HTML Options");
972
973  vbox = gtk_vbox_new (FALSE, 10);
974  gtk_widget_show (vbox);
975  gtk_container_add (GTK_CONTAINER (dlg), vbox);
976  gtk_container_border_width (GTK_CONTAINER (vbox), 10);
977
978  hbox = gtk_hbox_new (FALSE, 10);
979  gtk_widget_show (hbox);
980  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
981
982  vbox1 = gtk_vbox_new (FALSE, 10);
983  gtk_widget_show (vbox1);
984  gtk_box_pack_start (GTK_BOX (hbox), vbox1, TRUE, TRUE, 0);
985
986  frame = gtk_frame_new ("Layout");
987  gtk_widget_show (frame);
988  gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, TRUE, 0);
989
990  vbox2 = gtk_vbox_new (FALSE, 0);
991  gtk_widget_show (vbox2);
992  gtk_container_add (GTK_CONTAINER (frame), vbox2);
993  gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
994
995  s.single = gtk_radio_button_new_with_label (radio_group, "Single page");
996  radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.single));
997  gtk_widget_show (s.single);
998  gtk_box_pack_start (GTK_BOX (vbox2), s.single, TRUE, TRUE, 0);
999
1000  s.multiple = gtk_radio_button_new_with_label (radio_group, "One step per page");
1001  radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.multiple));
1002  gtk_widget_show (s.multiple);
1003  gtk_box_pack_start (GTK_BOX (vbox2), s.multiple, TRUE, TRUE, 0);
1004
1005  s.index = gtk_check_button_new_with_label ("Index page");
1006  gtk_widget_show (s.index);
1007  gtk_box_pack_start (GTK_BOX (vbox2), s.index, TRUE, TRUE, 0);
1008
1009  vbox2 = gtk_vbox_new (FALSE, 5);
1010  gtk_widget_show (vbox2);
1011  gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
1012
1013  button = gtk_button_new_with_label ("OK");
1014  gtk_signal_connect (GTK_OBJECT (button), "clicked",
1015              GTK_SIGNAL_FUNC (htmldlg_ok), &s);
1016  gtk_widget_show (button);
1017  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0);
1018  gtk_widget_set_usize (button, 60, -2);
1019  GtkAccelGroup *accel_group = gtk_accel_group_new ();
1020  gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
1021  gtk_widget_add_accelerator (button, "clicked", accel_group,
1022                              GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1023
1024  button = gtk_button_new_with_label ("Cancel");
1025  gtk_signal_connect (GTK_OBJECT (button), "clicked",
1026              GTK_SIGNAL_FUNC (dlg_default_callback), GINT_TO_POINTER (LC_CANCEL));
1027  gtk_widget_show (button);
1028  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0);
1029  gtk_widget_set_usize (button, 60, -2);
1030  gtk_widget_add_accelerator (button, "clicked", accel_group,
1031                              GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1032
1033  button = gtk_button_new_with_label ("Images...");
1034  gtk_signal_connect (GTK_OBJECT (button), "clicked",
1035              GTK_SIGNAL_FUNC (htmldlg_images), &s);
1036  gtk_widget_show (button);
1037  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0);
1038  gtk_widget_set_usize (button, 60, -2);
1039
1040  frame = gtk_frame_new ("Pieces List");
1041  gtk_widget_show (frame);
1042  gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, TRUE, 0);
1043
1044  vbox2 = gtk_vbox_new (FALSE, 0);
1045  gtk_widget_show (vbox2);
1046  gtk_container_add (GTK_CONTAINER (frame), vbox2);
1047  gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
1048
1049  s.list_step = gtk_check_button_new_with_label ("After each step");
1050  gtk_widget_show (s.list_step);
1051  gtk_box_pack_start (GTK_BOX (vbox2), s.list_step, TRUE, TRUE, 0);
1052
1053  s.list_end = gtk_check_button_new_with_label ("At the end");
1054  gtk_widget_show (s.list_end);
1055  gtk_box_pack_start (GTK_BOX (vbox2), s.list_end, TRUE, TRUE, 0);
1056
1057  s.images = gtk_check_button_new_with_label ("Create Images");
1058  gtk_widget_show (s.images);
1059  gtk_box_pack_start (GTK_BOX (vbox2), s.images, TRUE, TRUE, 0);
1060
1061  s.highlight = gtk_check_button_new_with_label ("Highlight new pieces");
1062  gtk_widget_show (s.highlight);
1063  gtk_box_pack_start (GTK_BOX (vbox), s.highlight, FALSE, TRUE, 0);
1064
1065  s.htmlext = gtk_check_button_new_with_label ("Save files with .html extension");
1066  gtk_widget_show (s.htmlext);
1067  gtk_box_pack_start (GTK_BOX (vbox), s.htmlext, FALSE, TRUE, 0);
1068
1069  hbox = gtk_hbox_new (FALSE, 5);
1070  gtk_widget_show (hbox);
1071  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1072
1073  label = gtk_label_new ("Output directory");
1074  gtk_widget_show (label);
1075  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
1076
1077  s.directory = gtk_entry_new ();
1078  gtk_widget_show (s.directory);
1079  gtk_box_pack_start (GTK_BOX (hbox), s.directory, TRUE, TRUE, 0);
1080
1081  button = gtk_button_new_with_label ("...");
1082  gtk_widget_show (button);
1083  gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0);
1084
1085  gtk_signal_connect (GTK_OBJECT (s.single), "toggled", GTK_SIGNAL_FUNC (htmldlg_layout), &s);
1086  gtk_signal_connect (GTK_OBJECT (s.multiple), "toggled", GTK_SIGNAL_FUNC (htmldlg_layout), &s);
1087  gtk_signal_connect (GTK_OBJECT (s.list_step), "toggled", GTK_SIGNAL_FUNC (htmldlg_list), &s);
1088  gtk_signal_connect (GTK_OBJECT (s.list_end), "toggled", GTK_SIGNAL_FUNC (htmldlg_list), &s);
1089
1090  if (opts->singlepage)
1091    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.single), TRUE);
1092  else
1093    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.multiple), TRUE);
1094  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.index), opts->index);
1095  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.images), opts->images);
1096  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.list_end), opts->listend);
1097  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.list_step), opts->liststep);
1098  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.highlight), opts->highlight);
1099  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s.htmlext), opts->htmlext);
1100
1101  gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (s.single));
1102  gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (s.list_step));
1103
1104