home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / yagirc-0.51.tar.gz / yagirc-0.51.tar / yagirc-0.51 / gui_setup_outlook.c < prev    next >
C/C++ Source or Header  |  1998-05-11  |  17KB  |  516 lines

  1. /*
  2.  
  3.  gui_setup_outlook.c : Outlook notebook entry for setup .. hm.. ok, this is
  4.                        probably worst code of yagirc so far... ;)
  5.  
  6.     Copyright (C) 1998 Timo Sirainen
  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., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <string.h>
  25.  
  26. #include <gtk/gtk.h>
  27. #include <glib.h>
  28.  
  29. #include "os.h"
  30. #include "irc.h"
  31. #include "gui.h"
  32.  
  33. GList *themes;
  34.  
  35. static GtkWidget *backg_text;
  36.  
  37. static GdkColor tempcolor;
  38. static GtkWidget *colorseldlg;
  39.  
  40. static GtkWidget *color_buttons[16];
  41.  
  42. static GtkList *themelist;
  43. static SETUP_THEME_REC *curtheme;
  44.  
  45. static void fsel_ok(GtkWidget *widget, GtkWidget *fsel)
  46. {
  47.     if (default_text_pixmap != NULL) g_free(default_text_pixmap);
  48.     default_text_pixmap = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fsel)));
  49.  
  50.     gtk_entry_set_text(GTK_ENTRY(backg_text), default_text_pixmap);
  51.  
  52.     gtk_widget_destroy(fsel);
  53. }
  54.  
  55. static void select_back(GtkWidget *widget)
  56. {
  57.     GtkWidget *fsel;
  58.  
  59.     fsel = gtk_file_selection_new(_("Select background image"));
  60.     gtk_signal_connect_object (GTK_OBJECT(fsel), "destroy",
  61.                                GTK_SIGNAL_FUNC (gtk_widget_destroy),
  62.                                GTK_OBJECT(fsel));
  63.     gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (fsel)->ok_button), "clicked",
  64.                                GTK_SIGNAL_FUNC (fsel_ok), GTK_OBJECT(fsel));
  65.     gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (fsel)->cancel_button), "clicked",
  66.                                (GtkSignalFunc) gtk_widget_destroy,
  67.                                GTK_OBJECT (fsel));
  68.     if (default_text_pixmap != NULL)
  69.         gtk_file_selection_set_filename(GTK_FILE_SELECTION(fsel), default_text_pixmap);
  70.  
  71.     gtk_grab_add (GTK_WIDGET (fsel));
  72.     gtk_widget_show(fsel);
  73. }
  74.  
  75. static void color_changed(GtkWidget *widget, GtkWidget *button)
  76. {
  77.     gdouble col[3];
  78.  
  79.     gtk_color_selection_get_color(GTK_COLOR_SELECTION(widget), col);
  80.     tempcolor.red = (guint16) (col[0]*65535.0);
  81.     tempcolor.green = (guint16) (col[1]*65535.0);
  82.     tempcolor.blue = (guint16) (col[2]*65535.0);
  83. }
  84.  
  85. static void color_selected(GtkWidget *widget, GtkWidget *button)
  86. {
  87.     GdkColor *color;
  88.     GtkStyle style;
  89.  
  90.     color = gtk_object_get_data(GTK_OBJECT(button), "color");
  91.     if (color != NULL) memcpy(color, &tempcolor, sizeof(GdkColor));
  92.  
  93.     gdk_color_alloc(gdk_window_get_colormap (button->window), color);
  94.     memcpy(&style, gtk_widget_get_style(button), sizeof(GtkStyle));
  95.     memcpy(&style.bg[0], color, sizeof(GdkColor));
  96.     gtk_widget_set_style(button, &style);
  97.  
  98.     gtk_widget_destroy(colorseldlg);
  99.  
  100.     curtheme->colors[14] = curtheme->fg;
  101. }
  102.  
  103. static void select_color(GtkWidget *widget, GtkWidget *button)
  104. {
  105.     GtkWidget *colorsel;
  106.     GdkColor *color;
  107.     gdouble colors[3];
  108.  
  109.     color = gtk_object_get_data(GTK_OBJECT(button), "color");
  110.     colors[0] = color->red/65535.0;
  111.     colors[1] = color->green/65535.0;
  112.     colors[2] = color->blue/65535.0;
  113.  
  114.     colorseldlg = gtk_color_selection_dialog_new(_("Select color"));
  115.     colorsel = GTK_COLOR_SELECTION_DIALOG(colorseldlg)->colorsel;
  116.     gtk_color_selection_set_color(GTK_COLOR_SELECTION(colorsel), colors);
  117.     gtk_signal_connect_object(GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG(colorseldlg)->cancel_button), "clicked",
  118.                        GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(colorseldlg));
  119.     gtk_signal_connect(GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG(colorseldlg)->ok_button), "clicked",
  120.                        GTK_SIGNAL_FUNC(color_selected), button);
  121.     gtk_signal_connect(GTK_OBJECT (colorsel), "color_changed",
  122.                        GTK_SIGNAL_FUNC(color_changed), button);
  123.     gtk_widget_show(colorseldlg);
  124.  
  125. }
  126.  
  127. static void add_color_label(int colpos, GtkWidget *box, char *text)
  128. {
  129.     GtkWidget *label;
  130.     GtkWidget *button;
  131.     GtkWidget *hbox;
  132.  
  133.     hbox = gtk_hbox_new(FALSE, 0);
  134.     gtk_container_border_width (GTK_CONTAINER (hbox), 2);
  135.     gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
  136.     gtk_widget_show(hbox);
  137.  
  138.     button = gtk_button_new();
  139.     gtk_signal_connect (GTK_OBJECT (button), "clicked",
  140.                         GTK_SIGNAL_FUNC(select_color), button);
  141.     gtk_widget_set_usize(button, 20, -1);
  142.     gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
  143.     gtk_widget_show(button);
  144.  
  145.     gtk_widget_realize(button);
  146.     color_buttons[colpos] = button;
  147.  
  148.     label = gtk_label_new(text);
  149.     gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
  150.     gtk_widget_show(label);
  151. }
  152.  
  153. static void refresh_colors(void)
  154. {
  155.     GtkStyle style;
  156.     GdkColor *color;
  157.     int n;
  158.  
  159.     if (color_buttons[0] == NULL) return;
  160.  
  161.     memcpy(&style, gtk_widget_get_style(color_buttons[0]), sizeof(GtkStyle));
  162.     for (n = 0; n < 16; n++)
  163.     {
  164.         if (n == 0)
  165.             color = &curtheme->fg;
  166.         else if (n == 1)
  167.             color = &curtheme->bg;
  168.         else
  169.             color = &curtheme->colors[n-2];
  170.         memcpy(&style.bg[0], color, sizeof(GdkColor));
  171.         gtk_widget_set_style(color_buttons[n], &style);
  172.         gtk_object_set_data(GTK_OBJECT(color_buttons[n]), "color", color);
  173.     }
  174.  
  175.     if (curtheme->pixmap == NULL)
  176.         gtk_entry_set_text(GTK_ENTRY(backg_text), "");
  177.     else
  178.         gtk_entry_set_text(GTK_ENTRY(backg_text), curtheme->pixmap);
  179. }
  180.  
  181. /* add theme record to GList with sort */
  182. int gui_add_theme_rec(GList **themes, char *data)
  183. {
  184.     SETUP_THEME_REC *theme;
  185.     GList *glist;
  186.     int pos;
  187.  
  188.     glist = g_list_first(*themes);
  189.     for (pos = 0; glist != NULL; pos++, glist = glist->next)
  190.     {
  191.         theme = (SETUP_THEME_REC *) glist->data;
  192.         if (strcasecmp(theme->name, data) > 0) break;
  193.     }
  194.  
  195.     theme = (SETUP_THEME_REC *) g_malloc(sizeof(SETUP_THEME_REC));
  196.     theme->name = g_strdup(data);
  197.     theme->fg = default_color;
  198.     theme->bg = default_bgcolor;
  199.     theme->pixmap = default_text_pixmap == NULL ? NULL : g_strdup(default_text_pixmap);
  200.     memcpy(theme->colors, yag_colors, sizeof(yag_colors));
  201.  
  202.     *themes = g_list_insert(*themes, theme, pos);
  203.  
  204.     return pos;
  205. }
  206.  
  207. /* remove theme record from list */
  208. void gui_remove_theme_rec(GList **themes, SETUP_THEME_REC *theme)
  209. {
  210.     if (theme->pixmap != NULL) g_free(theme->pixmap);
  211.     g_free(theme->name);
  212.  
  213.     *themes = g_list_remove(*themes, theme);
  214.     g_free(theme);
  215. }
  216.  
  217. /* add theme record to GtkList and GList */
  218. static void add_theme(GtkList *list, char *data)
  219. {
  220.     GtkWidget *li;
  221.     GList *glist;
  222.     int pos;
  223.  
  224.     pos = gui_add_theme_rec(&themes, data);
  225.  
  226.     li = gtk_list_item_new_with_label(data);
  227.     gtk_object_set_data(GTK_OBJECT(li), "theme", g_list_nth(themes, pos)->data);
  228.     gtk_widget_show(li);
  229.  
  230.     glist = g_list_append(NULL, li);
  231.     gtk_list_insert_items(list, glist, pos);
  232.  
  233.     gtk_list_select_child(list, li);
  234. }
  235.  
  236. /* signal: ok button pressed in theme dialog */
  237. static void sig_theme_ok(GtkWidget *window)
  238. {
  239.     GtkCombo *combo;
  240.     GtkEntry *entry;
  241.     char *theme;
  242.  
  243.     combo = gtk_object_get_data(GTK_OBJECT(window), "combo");
  244.     entry = gtk_object_get_data(GTK_OBJECT(window), "entry");
  245.  
  246.     theme = gtk_entry_get_text(entry);
  247.     if (*theme != '\0')
  248.     {
  249.         if (default_text_pixmap != NULL) g_free(default_text_pixmap);
  250.         default_text_pixmap = curtheme->pixmap == NULL ? NULL :
  251.             g_strdup(curtheme->pixmap);
  252.         default_color = curtheme->fg;
  253.         default_bgcolor = curtheme->bg;
  254.         memcpy(yag_colors, curtheme->colors, sizeof(yag_colors));
  255.  
  256.         add_theme(GTK_LIST(combo->list), theme);
  257.     }
  258.  
  259.     gtk_widget_destroy(window);
  260. }
  261.  
  262. /* signal: new theme button pressed */
  263. static void new_theme(GtkWidget *widget, GtkCombo *combo)
  264. {
  265.     GtkWidget *win;
  266.     GtkWidget *hbox;
  267.     GtkWidget *label;
  268.     GtkWidget *entry;
  269.     GtkWidget *button;
  270.  
  271.     win = gtk_dialog_new();
  272.     gtk_signal_connect (GTK_OBJECT (win), "delete_event",
  273.                         GTK_SIGNAL_FUNC(gtk_widget_destroy), win);
  274.     gtk_grab_add (GTK_WIDGET (win));
  275.     gtk_object_set_data(GTK_OBJECT(win), "combo", combo);
  276.  
  277.     label = gtk_label_new("Theme name:");
  278.     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(win)->vbox), label, FALSE, FALSE, 5);
  279.     gtk_widget_show(label);
  280.  
  281.     entry = gtk_entry_new();
  282.     gtk_object_set_data(GTK_OBJECT(win), "entry", entry);
  283.     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(win)->vbox), entry, FALSE, FALSE, 5);
  284.     gtk_signal_connect_object (GTK_OBJECT (entry), "activate",
  285.                                GTK_SIGNAL_FUNC (sig_theme_ok), GTK_OBJECT(win));
  286.     gtk_widget_show(entry);
  287.  
  288.     hbox = gtk_hbox_new(FALSE, 0);
  289.     gtk_container_border_width(GTK_CONTAINER(hbox), 4);
  290.     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(win)->vbox), hbox, FALSE, FALSE, 5);
  291.     gtk_widget_show(hbox);
  292.  
  293.     button = gtk_button_new_with_label (_("Ok"));
  294.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG(win)->action_area), button, TRUE, FALSE, 0);
  295.     gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
  296.                                GTK_SIGNAL_FUNC (sig_theme_ok), GTK_OBJECT(win));
  297.     GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  298.     gtk_widget_grab_default (button);
  299.     gtk_widget_show (button);
  300.  
  301.     button = gtk_button_new_with_label (_("Cancel"));
  302.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG(win)->action_area), button, TRUE, FALSE, 0);
  303.     gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
  304.                                GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT(win));
  305.     gtk_widget_show (button);
  306.     gtk_widget_grab_focus(entry);
  307.  
  308.     gtk_widget_show(win);
  309. }
  310.  
  311. /* signal: delete theme button pressed */
  312. static void delete_theme(GtkWidget *widget, GtkCombo *combo)
  313. {
  314.     SETUP_THEME_REC *theme;
  315.     GtkList *list;
  316.     GList *glist;
  317.  
  318.     g_return_if_fail(combo != NULL);
  319.  
  320.     list = GTK_LIST(combo->list);
  321.     if (list->selection == NULL || list->children->next == NULL) return;
  322.  
  323.     theme = gtk_object_get_data(GTK_OBJECT(list->selection->data), "theme");
  324.  
  325.     glist = g_list_append(NULL, list->selection->data);
  326.     gtk_list_remove_items(list, glist);
  327.  
  328.     gui_remove_theme_rec(&themes, theme);
  329. }
  330.  
  331. /* signal: theme changed */
  332. static void sig_listchange(GtkList *list, GtkWidget *child)
  333. {
  334.     SETUP_THEME_REC *newtheme;
  335.  
  336.     if (child == NULL) return;
  337.  
  338.     newtheme = gtk_object_get_data(GTK_OBJECT(child), "theme");
  339.     if (newtheme == curtheme) return;
  340.  
  341.     if (curtheme != NULL)
  342.     {
  343.         if (curtheme->pixmap != NULL) g_free(curtheme->pixmap);
  344.         gui_get_label(curtheme->pixmap, backg_text);
  345.         if (*curtheme->pixmap == '\0')
  346.         {
  347.             g_free(curtheme->pixmap);
  348.             curtheme->pixmap = NULL;
  349.         }
  350.     }
  351.  
  352.     curtheme = newtheme;
  353.     refresh_colors();
  354. }
  355.  
  356. void gui_setup_outlook(GtkWidget *vbox)
  357. {
  358.     GtkWidget *frame;
  359.     GtkWidget *combo;
  360.     GtkWidget *vbox2, *hbox;
  361.     GtkWidget *button;
  362.     GtkWidget *label;
  363.  
  364.     color_buttons[0] = NULL;
  365.  
  366.     /* theme-frame */
  367.     frame = gtk_frame_new("Theme");
  368.     gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
  369.     gtk_widget_show(frame);
  370.  
  371.     vbox2 = gtk_vbox_new(FALSE, 0);
  372.     gtk_container_border_width(GTK_CONTAINER(vbox2), 5);
  373.     gtk_container_add(GTK_CONTAINER(frame), vbox2);
  374.     gtk_widget_show(vbox2);
  375.  
  376.     combo = gtk_combo_new();
  377.     themelist = GTK_LIST(GTK_COMBO(combo)->list);
  378.     gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo)->entry), FALSE);
  379.     gtk_box_pack_start(GTK_BOX(vbox2), combo, FALSE, FALSE, 0);
  380.     gtk_widget_show(combo);
  381.  
  382.     hbox = gtk_hbox_new(FALSE, 0);
  383.     gtk_box_pack_start(GTK_BOX(vbox2), hbox, TRUE, TRUE, 10);
  384.     gtk_widget_show(hbox);
  385.  
  386.     button = gtk_button_new_with_label(_("New"));
  387.     gtk_signal_connect (GTK_OBJECT (button), "clicked",
  388.                         GTK_SIGNAL_FUNC(new_theme), combo);
  389.     gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10);
  390.     gtk_widget_show(button);
  391.  
  392.     button = gtk_button_new_with_label(_("Delete"));
  393.     gtk_signal_connect (GTK_OBJECT (button), "clicked",
  394.                         GTK_SIGNAL_FUNC(delete_theme), combo);
  395.     gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10);
  396.     gtk_widget_show(button);
  397.  
  398.     /* colors-frame */
  399.     frame = gtk_frame_new("Colors");
  400.     gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
  401.     gtk_widget_show(frame);
  402.  
  403.     vbox2 = gtk_vbox_new(FALSE, 0);
  404.     gtk_container_border_width(GTK_CONTAINER(vbox2), 5);
  405.     gtk_container_add(GTK_CONTAINER(frame), vbox2);
  406.     gtk_widget_show(vbox2);
  407.  
  408.     label = gtk_label_new(_("Background image:"));
  409.     gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0);
  410.     gtk_widget_show(label);
  411.  
  412.     hbox = gtk_hbox_new(FALSE, 0);
  413.     gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 5);
  414.     gtk_widget_show(hbox);
  415.  
  416.     backg_text = gtk_entry_new();
  417.     gtk_box_pack_start(GTK_BOX(hbox), backg_text, TRUE, TRUE, 0);
  418.     gtk_widget_show(backg_text);
  419.  
  420.     button = gtk_button_new_with_label(_("browse"));
  421.     gtk_signal_connect (GTK_OBJECT (button), "clicked",
  422.                         GTK_SIGNAL_FUNC(select_back), NULL);
  423.     gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 10);
  424.     gtk_widget_show(button);
  425.  
  426.     label = gtk_label_new(_("Channel colors:"));
  427.     gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 10);
  428.     gtk_widget_show(label);
  429.  
  430.     if (themes == NULL)
  431.         add_theme(GTK_LIST(GTK_COMBO(combo)->list), _("default theme"));
  432.     else
  433.     {
  434.         GList *tmp, *glist;
  435.         GtkWidget *li, *sel;
  436.  
  437.         sel = NULL;
  438.         for (tmp = g_list_first(themes); tmp != NULL; tmp = tmp->next)
  439.         {
  440.             SETUP_THEME_REC *data;
  441.  
  442.             data = (SETUP_THEME_REC *) tmp->data;
  443.  
  444.             li = gtk_list_item_new_with_label(data->name);
  445.             gtk_object_set_data(GTK_OBJECT(li), "theme", data);
  446.             gtk_widget_show(li);
  447.             if (sel == NULL || data == default_theme) sel = li;
  448.  
  449.             glist = g_list_append(NULL, li);
  450.             gtk_list_append_items(GTK_LIST(GTK_COMBO(combo)->list), glist);
  451.         }
  452.  
  453.         gtk_list_select_child(GTK_LIST(GTK_COMBO(combo)->list), sel);
  454.     }
  455.     curtheme = default_theme != NULL ? default_theme :
  456.         g_list_first(themes)->data;
  457.  
  458.     hbox = gtk_hbox_new(FALSE, 0);
  459.     gtk_box_pack_start(GTK_BOX(vbox2), hbox, TRUE, TRUE, 5);
  460.     gtk_widget_show(hbox);
  461.  
  462.     vbox2 = gtk_vbox_new(FALSE, 0);
  463.     gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);
  464.     gtk_widget_show(vbox2);
  465.  
  466.     add_color_label(0, vbox2, _("Default text color"));
  467.     add_color_label(1, vbox2, _("Default background"));
  468.     add_color_label(14, vbox2, _("Server notices"));
  469.     add_color_label(13, vbox2, _("Error messages"));
  470.     add_color_label(12, vbox2, _("yagIRC's notices"));
  471.     add_color_label(3, vbox2, _("Public message to you"));
  472.     add_color_label(4, vbox2, _("Channel name in <nick:#chan>"));
  473.     add_color_label(2, vbox2, _("Nick color for text you've written"));
  474.  
  475.     vbox2 = gtk_vbox_new(FALSE, 0);
  476.     gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);
  477.     gtk_widget_show(vbox2);
  478.  
  479.     add_color_label(11, vbox2, _("CTCP messages"));
  480.     add_color_label(15, vbox2, _("DCC messages"));
  481.     add_color_label(5, vbox2, _("/msg to you"));
  482.     add_color_label(6, vbox2, _(" - second color"));
  483.     add_color_label(7, vbox2, _("You sent /msg"));
  484.     add_color_label(8, vbox2, _(" - second color"));
  485.     add_color_label(9, vbox2, _("/me color"));
  486.     add_color_label(10, vbox2, _(" - second color"));
  487.  
  488.     gtk_signal_connect (GTK_OBJECT (GTK_COMBO(combo)->list), "select_child",
  489.                         GTK_SIGNAL_FUNC(sig_listchange), combo);
  490.     refresh_colors();
  491. }
  492.  
  493. /* OK button pressed in dialog - accept changes */
  494. void gui_setup_outlook_accept(void)
  495. {
  496.     if (default_text_pixmap != NULL) g_free(default_text_pixmap);
  497.  
  498.     if (themelist->selection != NULL)
  499.         default_theme = gtk_object_get_data(GTK_OBJECT(themelist->selection->data), "theme");
  500.  
  501.     if (curtheme->pixmap != NULL) g_free(curtheme->pixmap);
  502.     gui_get_label(curtheme->pixmap, backg_text);
  503.     if (*curtheme->pixmap == '\0')
  504.     {
  505.         g_free(curtheme->pixmap);
  506.         curtheme->pixmap = NULL;
  507.     }
  508.  
  509.     default_text_pixmap = default_theme->pixmap == NULL ? NULL :
  510.         g_strdup(default_theme->pixmap);
  511.     default_color = default_theme->fg;
  512.     default_bgcolor = default_theme->bg;
  513.     memcpy(yag_colors, default_theme->colors, sizeof(yag_colors));
  514. }
  515.  
  516.