home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / imagemap / imap_preferences.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-23  |  20.1 KB  |  626 lines

  1. /*
  2.  * This is a plug-in for the GIMP.
  3.  *
  4.  * Generates clickable image maps.
  5.  *
  6.  * Copyright (C) 1998-1999 Maurits Rijk  lpeek.mrijk@consunet.nl
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21.  *
  22.  */
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27.  
  28. #include "config.h"
  29. #include "libgimp/gimp.h"
  30. #include "libgimp/stdplugins-intl.h"
  31.  
  32. #include "imap_command.h"
  33. #include "imap_file.h"
  34. #include "imap_main.h"
  35. #include "imap_menu.h"
  36. #include "imap_misc.h"
  37. #include "imap_mru.h"
  38. #include "imap_preferences.h"
  39. #include "imap_table.h"
  40.  
  41. static gint
  42. parse_map_type(void)
  43. {
  44.    char *token = strtok(NULL, " )");
  45.    if (!strcmp(token, "ncsa"))
  46.       return NCSA;
  47.    else if (!strcmp(token, "cern"))
  48.       return CERN;
  49.    return CSIM;
  50. }
  51.  
  52. static gint
  53. parse_yes_no(void)
  54. {
  55.    char *token = strtok(NULL, " )");
  56.    return (gint) strcmp(token, "no");
  57. }
  58.  
  59. static gint
  60. parse_int(void)
  61. {
  62.    char *token = strtok(NULL, " )");
  63.    return (gint) atoi(token);
  64. }
  65.  
  66. static void
  67. parse_color(GdkColor *gdk_color)
  68. {
  69.    gint color[3];
  70.  
  71.    color[0] = parse_int();
  72.    color[1] = parse_int();
  73.    color[2] = parse_int();
  74.  
  75.    gdk_color->red = (guint16) color[0];
  76.    gdk_color->green = (guint16) color[1];
  77.    gdk_color->blue = (guint16) color[2];
  78. }
  79.  
  80. static void
  81. parse_mru_entry(void)
  82. {
  83.    char *filename = strtok(NULL, " )");
  84.    mru_add(get_mru(), filename);
  85. }
  86.  
  87. static void
  88. parse_line(PreferencesData_t *data, char *line)
  89. {
  90.    char *token;
  91.    ColorSelData_t *colors = &data->colors;
  92.  
  93.    line++;            /* Skip '(' */
  94.    token = strtok(line, " ");
  95.  
  96.    if (!strcmp(token, "default-map-type")) {
  97.       data->default_map_type = parse_map_type();
  98.    }else if (!strcmp(token, "prompt-for-area-info")) {
  99.       data->prompt_for_area_info = parse_yes_no();
  100.    } else if (!strcmp(token, "require-default-url")) {
  101.       data->require_default_url = parse_yes_no();
  102.    } else if (!strcmp(token, "show-area-handle")) {
  103.       data->show_area_handle = parse_yes_no();
  104.    } else if (!strcmp(token, "keep-circles-round")) {
  105.       data->keep_circles_round = parse_yes_no();
  106.    } else if (!strcmp(token, "show-url-tip")) {
  107.       data->show_url_tip = parse_yes_no();
  108.    } else if (!strcmp(token, "use-doublesized")) {
  109.       data->use_doublesized = parse_yes_no();
  110.    } else if (!strcmp(token, "mru-size")) {
  111.       data->mru_size = parse_int();
  112.    } else if (!strcmp(token, "undo-levels")) {
  113.       data->undo_levels = parse_int();
  114.    } else if (!strcmp(token, "normal-fg-color")) {
  115.       parse_color(&colors->normal_fg);
  116.    } else if (!strcmp(token, "normal-bg-color")) {
  117.       parse_color(&colors->normal_bg);
  118.    } else if (!strcmp(token, "selected-fg-color")) {
  119.       parse_color(&colors->selected_fg);
  120.    } else if (!strcmp(token, "selected-bg-color")) {
  121.       parse_color(&colors->selected_bg);
  122.    } else if (!strcmp(token, "mru-entry")) {
  123.       parse_mru_entry();
  124.    } else {
  125.       /* Unrecognized, just ignore rest of line */
  126.    }
  127. }
  128.  
  129. gboolean
  130. preferences_load(PreferencesData_t *data)
  131. {
  132.    FILE *in;
  133.    char buf[256];
  134.    gchar *filename;
  135.  
  136.    filename = g_strconcat(gimp_directory(), "/imagemaprc", NULL);
  137.  
  138.    in = fopen(filename, "r");
  139.    g_free(filename);
  140.    if (in) {
  141.       while (fgets(buf, sizeof(buf), in)) {
  142.      if (*buf != '\n' && *buf != '#') {
  143.         parse_line(data, buf);
  144.      }
  145.       }
  146.       fclose(in);
  147.       return TRUE;
  148.    }
  149.    return FALSE;
  150. }
  151.  
  152. void
  153. preferences_save(PreferencesData_t *data)
  154. {
  155.    FILE *out;
  156.    gchar *filename;
  157.    ColorSelData_t *colors = &data->colors;
  158.  
  159.    filename = g_strconcat(gimp_directory(), "/imagemaprc", NULL);
  160.  
  161.    out = fopen(filename, "w");
  162.    if (out) {
  163.       fprintf(out, "# Imagemap plug-in resource file\n\n");
  164.       if (data->default_map_type == NCSA)
  165.      fprintf(out, "(default-map-type ncsa)\n");
  166.       else if (data->default_map_type == CERN)
  167.      fprintf(out, "(default-map-type cern)\n");
  168.       else
  169.      fprintf(out, "(default-map-type csim)\n");
  170.  
  171.       fprintf(out, "(prompt-for-area-info %s)\n",
  172.           (data->prompt_for_area_info) ? "yes" : "no");
  173.       fprintf(out, "(require-default-url %s)\n",
  174.           (data->require_default_url) ? "yes" : "no");
  175.       fprintf(out, "(show-area-handle %s)\n",
  176.           (data->show_area_handle) ? "yes" : "no");
  177.       fprintf(out, "(keep-circles-round %s)\n",
  178.           (data->keep_circles_round) ? "yes" : "no");
  179.       fprintf(out, "(show-url-tip %s)\n",
  180.           (data->show_url_tip) ? "yes" : "no");
  181.       fprintf(out, "(use-doublesized %s)\n",
  182.           (data->use_doublesized) ? "yes" : "no");
  183.  
  184.       fprintf(out, "(undo-levels %d)\n", data->undo_levels);
  185.       fprintf(out, "(mru-size %d)\n", data->mru_size);
  186.  
  187.       fprintf(out, "(normal-fg-color %d %d %d)\n",
  188.           colors->normal_fg.red, colors->normal_fg.green, 
  189.           colors->normal_fg.blue);
  190.       fprintf(out, "(normal-bg-color %d %d %d)\n",
  191.           colors->normal_bg.red, colors->normal_bg.green, 
  192.           colors->normal_bg.blue);
  193.       fprintf(out, "(selected-fg-color %d %d %d)\n",
  194.           colors->selected_fg.red, colors->selected_fg.green, 
  195.           colors->selected_fg.blue);
  196.       fprintf(out, "(selected-bg-color %d %d %d)\n",
  197.           colors->selected_bg.red, colors->selected_bg.green, 
  198.           colors->selected_bg.blue);
  199.  
  200.       mru_write(get_mru(), out);
  201.  
  202.       fclose(out);
  203.    } else {
  204.       do_file_error_dialog( _("Couldn't save resource file:"), filename);
  205.    }
  206.    g_free(filename);
  207. }
  208.  
  209. static void
  210. preferences_ok_cb(gpointer data)
  211. {
  212.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  213.    PreferencesData_t *old_data = param->old_data;
  214.    ColorSelData_t *colors = &old_data->colors;
  215.    MRU_t *mru = get_mru();
  216.  
  217.    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->cern)))
  218.       old_data->default_map_type = CERN;
  219.    else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->ncsa)))
  220.       old_data->default_map_type = NCSA;
  221.    else
  222.       old_data->default_map_type = CSIM;
  223.  
  224.    old_data->prompt_for_area_info = gtk_toggle_button_get_active(
  225.       GTK_TOGGLE_BUTTON(param->prompt_for_area_info));
  226.    old_data->require_default_url = gtk_toggle_button_get_active(
  227.       GTK_TOGGLE_BUTTON(param->require_default_url));
  228.    old_data->show_area_handle = gtk_toggle_button_get_active(
  229.       GTK_TOGGLE_BUTTON(param->show_area_handle));
  230.    old_data->keep_circles_round = gtk_toggle_button_get_active(
  231.       GTK_TOGGLE_BUTTON(param->keep_circles_round));
  232.    old_data->show_url_tip = gtk_toggle_button_get_active(
  233.       GTK_TOGGLE_BUTTON(param->show_url_tip));
  234.    old_data->use_doublesized = gtk_toggle_button_get_active(
  235.       GTK_TOGGLE_BUTTON(param->use_doublesized));
  236.  
  237.    old_data->mru_size = 
  238.       gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->mru_size));
  239.    old_data->undo_levels = 
  240.       gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->undo_levels));
  241.    mru_set_size(mru, old_data->mru_size);
  242.    menu_build_mru_items(mru);
  243.    command_list_set_undo_level(old_data->undo_levels);
  244.  
  245.    *colors = param->new_colors;
  246.  
  247.    gdk_gc_set_foreground(old_data->normal_gc, &colors->normal_fg);
  248.    gdk_gc_set_background(old_data->normal_gc, &colors->normal_bg);
  249.    gdk_gc_set_foreground(old_data->selected_gc, &colors->selected_fg);
  250.    gdk_gc_set_background(old_data->selected_gc, &colors->selected_bg);
  251.  
  252.    set_sash_size(old_data->use_doublesized);
  253.    redraw_preview();
  254. }
  255.  
  256. static void
  257. set_button_colors(PreferencesDialog_t *dialog, ColorSelData_t *colors)
  258. {
  259.    gdk_window_set_background(dialog->normal_fg->window, 
  260.                  &colors->normal_fg);
  261.    gdk_window_clear(dialog->normal_fg->window);
  262.    gdk_window_set_background(dialog->normal_bg->window, 
  263.                  &colors->normal_bg);
  264.    gdk_window_clear(dialog->normal_bg->window);
  265.    gdk_window_set_background(dialog->selected_fg->window, 
  266.                  &colors->selected_fg);
  267.    gdk_window_clear(dialog->selected_fg->window);
  268.    gdk_window_set_background(dialog->selected_bg->window, 
  269.                  &colors->selected_bg);
  270.    gdk_window_clear(dialog->selected_bg->window);
  271. }
  272.  
  273. static void
  274. select_color_cancel(GtkWidget *widget, gpointer data)
  275. {
  276.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  277.    gtk_widget_hide(param->color_sel_dlg);
  278.    set_button_colors(param, ¶m->old_colors);
  279. }
  280.  
  281. static void
  282. select_color_ok(GtkWidget *widget, gpointer data)
  283. {
  284.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  285.    param->old_colors = param->new_colors;
  286.    gtk_widget_hide(param->color_sel_dlg);
  287. }
  288.  
  289. static void (*_color_changed_func)(GtkWidget *widget, gpointer data);
  290.  
  291. static void
  292. color_changed(GtkWidget *widget, gpointer data)
  293. {
  294.    (*_color_changed_func)(widget, data);
  295. }
  296.  
  297. static void
  298. change_color(PreferencesDialog_t *param, GtkWidget *button, 
  299.          GdkColor *gdk_color)
  300. {
  301.    gdouble color[3];
  302.    GdkColormap *colormap;
  303.    GtkColorSelection *colorsel = GTK_COLOR_SELECTION(param->color_sel);
  304.  
  305.    gtk_color_selection_get_color(colorsel, color);
  306.    
  307.    gdk_color->red = (guint16)(color[0]*65535.0);
  308.    gdk_color->green = (guint16)(color[1]*65535.0);
  309.    gdk_color->blue = (guint16)(color[2]*65535.0);
  310.  
  311.    colormap = gdk_window_get_colormap(button->window);
  312.    gdk_color_alloc(colormap, gdk_color);
  313.    gdk_window_set_background(button->window, gdk_color);
  314.    gdk_window_clear(button->window);
  315. }
  316.  
  317. static void
  318. normal_fg_color_changed(GtkWidget *widget, gpointer data)
  319. {
  320.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  321.    change_color(param, param->normal_fg, ¶m->new_colors.normal_fg);
  322. }
  323.  
  324. static void
  325. normal_bg_color_changed(GtkWidget *widget, gpointer data)
  326. {
  327.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  328.    change_color(param, param->normal_bg, ¶m->new_colors.normal_bg);
  329. }
  330.  
  331. static void
  332. selected_fg_color_changed(GtkWidget *widget, gpointer data)
  333. {
  334.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  335.    change_color(param, param->selected_fg, ¶m->new_colors.selected_fg);
  336. }
  337.  
  338. static void
  339. selected_bg_color_changed(GtkWidget *widget, gpointer data)
  340. {
  341.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  342.    change_color(param, param->selected_bg, ¶m->new_colors.selected_bg);
  343. }
  344.  
  345. static gint
  346. area_event(GtkWidget *widget, GdkEvent *event, PreferencesDialog_t *param,
  347.        GdkColor *gdk_color, 
  348.        void (*color_changed_func)(GtkWidget *widget, gpointer data))
  349. {
  350.    gdouble color[3];
  351.  
  352.    if (event->type != GDK_BUTTON_PRESS)
  353.       return FALSE;
  354.  
  355.    if (!param->color_sel_dlg) {
  356.       GtkWidget *dialog = gtk_color_selection_dialog_new( _("Select Color"));
  357.  
  358.       param->color_sel_dlg = dialog;
  359.  
  360.       param->color_sel = GTK_COLOR_SELECTION_DIALOG(
  361.      param->color_sel_dlg)->colorsel;
  362.    
  363.       gtk_signal_connect(GTK_OBJECT(param->color_sel), "color_changed", 
  364.              (GtkSignalFunc)color_changed, (gpointer) param);
  365.  
  366.       gtk_signal_connect(
  367.      GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(dialog)->ok_button), 
  368.      "clicked", GTK_SIGNAL_FUNC(select_color_ok), (gpointer) param);
  369.  
  370.       gtk_signal_connect(
  371.      GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(dialog)->cancel_button), 
  372.      "clicked", GTK_SIGNAL_FUNC(select_color_cancel), (gpointer) param);
  373.  
  374.    }
  375.  
  376.    _color_changed_func = color_changed_func;
  377.  
  378.    color[0] = (gdouble) gdk_color->red / 65535.0;
  379.    color[1] = (gdouble) gdk_color->green / 65535.0;
  380.    color[2] = (gdouble) gdk_color->blue / 65535.0;
  381.    gtk_color_selection_set_color(GTK_COLOR_SELECTION(param->color_sel), color);
  382.  
  383.    gtk_widget_show(param->color_sel_dlg);
  384.    return TRUE;
  385. }
  386.  
  387. static gint
  388. edit_normal_fg(GtkWidget *widget, GdkEvent *event, PreferencesDialog_t *param)
  389. {
  390.    return area_event(widget, event, param, ¶m->old_data->colors.normal_fg,
  391.              normal_fg_color_changed);
  392. }
  393.  
  394. static gint
  395. edit_normal_bg(GtkWidget *widget, GdkEvent *event, PreferencesDialog_t *param)
  396. {
  397.    return area_event(widget, event, param, ¶m->old_data->colors.normal_bg,
  398.              normal_bg_color_changed);
  399. }
  400.  
  401. static gint
  402. edit_selected_fg(GtkWidget *widget, GdkEvent *event, 
  403.          PreferencesDialog_t *param)
  404. {
  405.    return area_event(widget, event, param, 
  406.              ¶m->old_data->colors.selected_fg,
  407.              selected_fg_color_changed);
  408. }
  409.  
  410. static gint
  411. edit_selected_bg(GtkWidget *widget, GdkEvent *event, 
  412.          PreferencesDialog_t *param)
  413. {
  414.    return area_event(widget, event, param, 
  415.              ¶m->old_data->colors.selected_bg,
  416.              selected_bg_color_changed);
  417. }
  418.  
  419. static void
  420. create_general_tab(PreferencesDialog_t *data, GtkWidget *notebook)
  421. {
  422.    GtkWidget *table;
  423.    GtkWidget *frame;
  424.    GtkWidget *hbox;
  425.    GSList    *group;
  426.    GtkWidget *label;
  427.  
  428.    table = gtk_table_new(7, 2, FALSE);
  429.    gtk_container_set_border_width(GTK_CONTAINER(table), 10);
  430.    gtk_table_set_row_spacings(GTK_TABLE(table), 10);
  431.    gtk_table_set_col_spacings(GTK_TABLE(table), 10);
  432.    gtk_widget_show(table);
  433.  
  434.    frame = gtk_frame_new( _("Default Map Type"));
  435.    gtk_widget_show(frame);
  436.    gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 2, 0, 1);
  437.    hbox = gtk_hbox_new(FALSE, 1);
  438.    gtk_container_add(GTK_CONTAINER(frame), hbox);
  439.    gtk_widget_show(hbox);
  440.    data->ncsa = gtk_radio_button_new_with_label(NULL, "NCSA");
  441.    gtk_box_pack_start(GTK_BOX(hbox), data->ncsa, TRUE, TRUE, 10);
  442.    gtk_widget_show(data->ncsa);
  443.    group = gtk_radio_button_group(GTK_RADIO_BUTTON(data->ncsa));
  444.    data->cern = gtk_radio_button_new_with_label(group, "CERN");
  445.    gtk_box_pack_start(GTK_BOX(hbox), data->cern, TRUE, TRUE, 10);
  446.    gtk_widget_show(data->cern);
  447.    group = gtk_radio_button_group(GTK_RADIO_BUTTON(data->cern));
  448.    data->csim = gtk_radio_button_new_with_label(group, "CSIM");
  449.    gtk_box_pack_start(GTK_BOX(hbox), data->csim, TRUE, TRUE, 10);
  450.    gtk_widget_show(data->csim);
  451.  
  452.    data->prompt_for_area_info = 
  453.       create_check_button_in_table(table, 1, 0, _("Prompt for area info"));
  454.    data->require_default_url = 
  455.       create_check_button_in_table(table, 2, 0, _("Require default URL"));
  456.    data->show_area_handle = 
  457.       create_check_button_in_table(table, 3, 0, _("Show area handles"));
  458.    data->keep_circles_round = 
  459.       create_check_button_in_table(table, 4, 0, _("Keep NCSA circles true"));
  460.    data->show_url_tip =
  461.       create_check_button_in_table(table, 5, 0, _("Show area URL tip"));
  462.    data->use_doublesized = 
  463.       create_check_button_in_table(table, 6, 0,
  464.                    _("Use double-sized grab handles"));
  465.    gtk_widget_show(frame);
  466.  
  467.    label = gtk_label_new( _("General"));
  468.    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label);
  469. }
  470.  
  471. static void
  472. create_menu_tab(PreferencesDialog_t *data, GtkWidget *notebook)
  473. {
  474.    GtkWidget *table;
  475.    GtkWidget *label;
  476.    GtkWidget *vbox;
  477.  
  478.    vbox = gtk_vbox_new(FALSE, 1);
  479.    gtk_widget_show(vbox);
  480.  
  481.    table = gtk_table_new(2, 2, FALSE);
  482.    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
  483.    gtk_container_set_border_width(GTK_CONTAINER(table), 10);
  484.    gtk_table_set_row_spacings(GTK_TABLE(table), 10);
  485.    gtk_table_set_col_spacings(GTK_TABLE(table), 10);
  486.    gtk_widget_show(table);
  487.  
  488.    create_label_in_table(table, 0, 0, _("Number of Undo levels (1 - 99):"));
  489.    data->undo_levels = create_spin_button_in_table(table, 0, 1, 1, 1, 99);
  490.  
  491.    create_label_in_table(table, 1, 0, _("Number of MRU entries (1 - 16):"));
  492.    data->mru_size = create_spin_button_in_table(table, 1, 1, 1, 1, 16);
  493.  
  494.    label = gtk_label_new( _("Menu"));
  495.    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
  496. }
  497.  
  498. static GtkWidget*
  499. create_color_field(PreferencesDialog_t *data, GtkWidget *table, gint row, 
  500.            gint col, GtkSignalFunc func)
  501. {
  502.    GtkWidget *area = gtk_drawing_area_new();
  503.  
  504.    gtk_drawing_area_size(GTK_DRAWING_AREA(area), 16, 8);
  505.    gtk_widget_set_events(area, GDK_BUTTON_PRESS_MASK);
  506.    gtk_table_attach_defaults(GTK_TABLE(table), area, col, col + 1, row, 
  507.                  row + 1);
  508.    gtk_signal_connect(GTK_OBJECT(area), "event", func, (gpointer) data);
  509.    gtk_widget_show(area);
  510.  
  511.    return area;
  512. }
  513.  
  514. static void
  515. create_colors_tab(PreferencesDialog_t *data, GtkWidget *notebook)
  516. {
  517.    GtkWidget *table, *label;
  518.    GtkWidget *vbox;
  519.  
  520.    vbox = gtk_vbox_new(FALSE, 1);
  521.    gtk_widget_show(vbox);
  522.  
  523.    table = gtk_table_new(2, 3, FALSE);
  524.    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
  525.    gtk_container_set_border_width(GTK_CONTAINER(table), 10);
  526.    gtk_table_set_col_spacings(GTK_TABLE(table), 10);
  527.    gtk_table_set_row_spacings(GTK_TABLE(table), 10);
  528.    gtk_widget_show(table);
  529.  
  530.    create_label_in_table(table, 0, 0, _("Normal:"));
  531.    data->normal_fg = create_color_field(data, table, 0, 1, 
  532.                     (GtkSignalFunc) edit_normal_fg);
  533.    data->normal_bg = create_color_field(data, table, 0, 2,
  534.                     (GtkSignalFunc) edit_normal_bg);
  535.  
  536.    create_label_in_table(table, 1, 0, _("Selected:"));
  537.    data->selected_fg = create_color_field(data, table, 1, 1,
  538.                       (GtkSignalFunc) edit_selected_fg);
  539.    data->selected_bg = create_color_field(data, table, 1, 2,
  540.                       (GtkSignalFunc) edit_selected_bg);
  541.  
  542.    label = gtk_label_new( _("Colors"));
  543.    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
  544. }
  545.  
  546. static void
  547. switch_page(GtkWidget *widget, GtkNotebookPage *page, gint page_num, 
  548.         gpointer data)
  549. {
  550.    if (page_num == 2) {
  551.       PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  552.       set_button_colors(param, ¶m->old_colors);
  553.    }
  554. }
  555.  
  556. static PreferencesDialog_t*
  557. create_preferences_dialog()
  558. {
  559.    PreferencesDialog_t *data = g_new(PreferencesDialog_t, 1);
  560.    DefaultDialog_t *dialog;
  561.    GtkWidget *notebook;
  562.  
  563.    data->color_sel_dlg = NULL;
  564.    data->dialog = dialog = make_default_dialog( _("General Preferences"));
  565.    default_dialog_set_ok_cb(dialog, preferences_ok_cb, (gpointer) data);
  566.    
  567.    data->notebook = notebook = gtk_notebook_new();
  568.    gtk_container_set_border_width(GTK_CONTAINER(notebook), 10);
  569.    gtk_signal_connect_after(GTK_OBJECT(notebook), "switch_page", 
  570.                 GTK_SIGNAL_FUNC(switch_page), (gpointer) data);
  571.  
  572.    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog->dialog)->vbox), 
  573.               notebook, TRUE, TRUE, 10);
  574.    create_general_tab(data, notebook);
  575.    create_menu_tab(data, notebook);
  576.    create_colors_tab(data, notebook);
  577.  
  578.    gtk_widget_show(notebook);
  579.  
  580.    return data;
  581. }
  582.  
  583. void
  584. do_preferences_dialog(void)
  585. {
  586.    static PreferencesDialog_t *dialog;
  587.    PreferencesData_t *old_data;
  588.    GtkWidget *map_type;
  589.  
  590.    if (!dialog) {
  591.       dialog = create_preferences_dialog();
  592.    }
  593.    gtk_notebook_set_page(GTK_NOTEBOOK(dialog->notebook), 0);
  594.    dialog->old_data = old_data = get_preferences();
  595.    dialog->new_colors = dialog->old_colors = old_data->colors;
  596.  
  597.    if (old_data->default_map_type == CERN)
  598.       map_type = dialog->cern;
  599.    else if (old_data->default_map_type == NCSA)
  600.       map_type = dialog->ncsa;
  601.    else
  602.       map_type = dialog->csim;
  603.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(map_type), TRUE);
  604.  
  605.    gtk_toggle_button_set_active(
  606.       GTK_TOGGLE_BUTTON(dialog->prompt_for_area_info),
  607.       old_data->prompt_for_area_info);
  608.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->require_default_url),
  609.                 old_data->require_default_url);
  610.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->show_area_handle),
  611.                 old_data->show_area_handle);
  612.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->keep_circles_round),
  613.                 old_data->keep_circles_round);
  614.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->show_url_tip),
  615.                 old_data->show_url_tip);
  616.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->use_doublesized),
  617.                 old_data->use_doublesized);
  618.    
  619.    gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->undo_levels), 
  620.                  old_data->undo_levels);
  621.    gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->mru_size), 
  622.                  old_data->mru_size);
  623.  
  624.    default_dialog_show(dialog->dialog);
  625. }
  626.