summaryrefslogtreecommitdiff
path: root/charpick/properties.c
diff options
context:
space:
mode:
Diffstat (limited to 'charpick/properties.c')
-rw-r--r--charpick/properties.c560
1 files changed, 560 insertions, 0 deletions
diff --git a/charpick/properties.c b/charpick/properties.c
new file mode 100644
index 00000000..c3347352
--- /dev/null
+++ b/charpick/properties.c
@@ -0,0 +1,560 @@
+/* properties.c -- properties dialog box and session management for character
+ * picker applet. Much of this is adapted from modemlights/properties.c
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "charpick.h"
+
+#include <string.h>
+
+#include <atk/atkrelation.h>
+#include <gtk/gtk.h>
+
+#define CHARPICK_STOCK_EDIT "charpick-stock-edit"
+
+void
+register_stock_for_edit (void)
+{
+ static gboolean registered = FALSE;
+ if (!registered)
+ {
+ GtkIconFactory *factory;
+ GtkIconSet *icons;
+
+ static const GtkStockItem edit_item [] = {
+ { CHARPICK_STOCK_EDIT, N_("_Edit"), 0, 0, GETTEXT_PACKAGE },
+ };
+ icons = gtk_icon_factory_lookup_default (GTK_STOCK_PREFERENCES);
+ factory = gtk_icon_factory_new ();
+ gtk_icon_factory_add (factory, CHARPICK_STOCK_EDIT, icons);
+ gtk_icon_factory_add_default (factory);
+ gtk_stock_add_static (edit_item, 1);
+ registered = TRUE;
+ }
+}
+
+#if 0
+static void
+set_atk_relation (GtkWidget *label, GtkWidget *widget)
+{
+ AtkObject *atk_widget;
+ AtkObject *atk_label;
+ AtkRelationSet *relation_set;
+ AtkRelation *relation;
+ AtkObject *targets[1];
+
+ atk_widget = gtk_widget_get_accessible (widget);
+ atk_label = gtk_widget_get_accessible (label);
+
+ /* set label-for relation */
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
+
+ /* return if gail is not loaded */
+ if (GTK_IS_ACCESSIBLE (atk_widget) == FALSE)
+ return;
+
+ /* set label-by relation */
+ relation_set = atk_object_ref_relation_set (atk_widget);
+ targets[0] = atk_label;
+ relation = atk_relation_new (targets, 1, ATK_RELATION_LABELLED_BY);
+ atk_relation_set_add (relation_set, relation);
+ g_object_unref (G_OBJECT (relation));
+}
+#endif /* 0 */
+
+/* sets accessible name and description */
+
+static void
+set_access_namedesc (GtkWidget *widget, const gchar *name, const gchar *desc)
+{
+ AtkObject *obj;
+
+ obj = gtk_widget_get_accessible (widget);
+ if (! GTK_IS_ACCESSIBLE (obj))
+ return;
+
+ if ( desc )
+ atk_object_set_description (obj, desc);
+ if ( name )
+ atk_object_set_name (obj, name);
+}
+
+void
+add_edit_dialog_create (charpick_data *curr_data, gchar *string, gchar *title)
+{
+ GtkWidget *dialog;
+ GtkWidget *entry;
+ GtkWidget *dbox;
+ GtkWidget *vbox, *hbox;
+ GtkWidget *label;
+
+ dialog = gtk_dialog_new_with_buttons (_(title), GTK_WINDOW (curr_data->propwindow),
+ GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_OK,
+ NULL);
+
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (curr_data->propwindow));
+ gtk_widget_set_sensitive (curr_data->propwindow, FALSE);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+ gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area(GTK_DIALOG (dialog))), 2);
+
+ dbox = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
+
+ vbox = gtk_vbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (dbox), vbox, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+
+ label = gtk_label_new_with_mnemonic (_("_Palette:"));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ entry = gtk_entry_new ();
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry);
+ gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
+ gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+
+ set_access_namedesc (entry, _("Palette entry"),
+ _("Modify a palette by adding or removing characters"));
+ if (string)
+ gtk_entry_set_text (GTK_ENTRY (entry), string);
+
+ curr_data->add_edit_dialog = dialog;
+ curr_data->add_edit_entry = entry;
+}
+
+static void
+add_palette_cb (GtkDialog *dialog, int response_id, charpick_data *curr_data)
+{
+ GList *list = curr_data->chartable;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreeSelection *selection;
+ GtkTreePath *path;
+ char *new;
+
+ gtk_widget_set_sensitive (curr_data->propwindow, TRUE);
+
+ if (response_id != GTK_RESPONSE_OK) {
+ gtk_widget_destroy (curr_data->add_edit_dialog);
+ return;
+ }
+
+ new = gtk_editable_get_chars (GTK_EDITABLE (curr_data->add_edit_entry), 0, -1);
+
+ gtk_widget_destroy (curr_data->add_edit_dialog);
+
+ if (!new || strlen (new) == 0)
+ return;
+
+ list = g_list_append (list, new);
+
+ if (curr_data->chartable == NULL) {
+ curr_data->chartable = list;
+ curr_data->charlist = curr_data->chartable->data;
+ build_table (curr_data);
+
+ if (key_writable (MATE_PANEL_APPLET (curr_data->applet), "current_list"))
+ mate_panel_applet_mateconf_set_string (MATE_PANEL_APPLET (curr_data->applet),
+ "current_list",
+ curr_data->charlist, NULL);
+ }
+
+ save_chartable (curr_data);
+ populate_menu (curr_data);
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (curr_data->pref_tree));
+
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, new, 1, new, -1);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (curr_data->pref_tree));
+ gtk_tree_selection_select_iter (selection, &iter);
+
+ path = gtk_tree_model_get_path (model, &iter);
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (curr_data->pref_tree), path,
+ NULL, FALSE, 0.0, 0.0);
+
+ gtk_tree_path_free (path);
+}
+
+static void
+edit_palette_cb (GtkDialog *dialog, int response_id, charpick_data *curr_data)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ GList *list;
+ char *new, *charlist;
+
+ gtk_widget_set_sensitive (curr_data->propwindow, TRUE);
+
+ if (response_id != GTK_RESPONSE_OK) {
+ gtk_widget_destroy (curr_data->add_edit_dialog);
+ return;
+ }
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (curr_data->pref_tree));
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return;
+
+ gtk_tree_model_get (model, &iter, 1, &charlist, -1);
+
+ new = gtk_editable_get_chars (GTK_EDITABLE (curr_data->add_edit_entry), 0, -1);
+
+ gtk_widget_destroy (curr_data->add_edit_dialog);
+
+ if (!new || (g_ascii_strcasecmp (new, charlist) == 0))
+ return;
+
+ list = g_list_find (curr_data->chartable, charlist);
+ list->data = new;
+ save_chartable (curr_data);
+ populate_menu (curr_data);
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, new, 1, new, -1);
+
+ if (g_ascii_strcasecmp (curr_data->charlist, charlist) == 0) {
+ curr_data->charlist = new;
+ build_table (curr_data);
+
+ if (key_writable (MATE_PANEL_APPLET (curr_data->applet), "current_list"))
+ mate_panel_applet_mateconf_set_string (MATE_PANEL_APPLET (curr_data->applet), "current_list", curr_data->charlist, NULL);
+ }
+
+ g_free (charlist);
+}
+
+static void
+add_palette (GtkButton *buttonk, charpick_data *curr_data)
+{
+ if (curr_data->add_edit_dialog == NULL) {
+ add_edit_dialog_create (curr_data, NULL, _("Add Palette"));
+
+ g_signal_connect (curr_data->add_edit_dialog,
+ "response",
+ G_CALLBACK (add_palette_cb),
+ curr_data);
+
+ g_signal_connect (curr_data->add_edit_dialog,
+ "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &curr_data->add_edit_dialog);
+
+ gtk_widget_show_all (curr_data->add_edit_dialog);
+ } else {
+ gtk_window_set_screen (GTK_WINDOW (curr_data->add_edit_dialog),
+ gtk_widget_get_screen (GTK_WIDGET (curr_data->applet)));
+
+ gtk_window_present (GTK_WINDOW (curr_data->add_edit_dialog));
+ }
+}
+
+static void
+edit_palette (GtkButton *button, charpick_data *curr_data)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ char *charlist;
+
+ if (curr_data->add_edit_dialog == NULL) {
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (curr_data->pref_tree));
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return;
+
+ gtk_tree_model_get (model, &iter, 1, &charlist, -1);
+
+ add_edit_dialog_create (curr_data, charlist, _("Edit Palette"));
+
+ g_signal_connect (curr_data->add_edit_dialog,
+ "response",
+ G_CALLBACK (edit_palette_cb),
+ curr_data);
+
+ g_signal_connect (curr_data->add_edit_dialog,
+ "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &curr_data->add_edit_dialog);
+
+ gtk_widget_show_all (curr_data->add_edit_dialog);
+ } else {
+ gtk_window_set_screen (GTK_WINDOW (curr_data->add_edit_dialog),
+ gtk_widget_get_screen (GTK_WIDGET (curr_data->applet)));
+
+ gtk_window_present (GTK_WINDOW (curr_data->add_edit_dialog));
+ }
+}
+
+static void
+delete_palette (GtkButton *button, charpick_data *curr_data)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter iter, next;
+ GtkTreeModel *model;
+ gchar *charlist;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (curr_data->pref_tree));
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return;
+
+ gtk_tree_model_get (model, &iter, 1, &charlist, -1);
+
+ curr_data->chartable = g_list_remove (curr_data->chartable, charlist);
+
+ if (g_ascii_strcasecmp (curr_data->charlist, charlist) == 0) {
+ curr_data->charlist = curr_data->chartable != NULL ?
+ curr_data->chartable->data : "";
+ if (key_writable (MATE_PANEL_APPLET (curr_data->applet), "current_list"))
+ mate_panel_applet_mateconf_set_string (MATE_PANEL_APPLET (curr_data->applet), "current_list", curr_data->charlist, NULL);
+ }
+ g_free (charlist);
+
+ save_chartable (curr_data);
+ populate_menu (curr_data);
+
+ gtk_widget_grab_focus (curr_data->pref_tree);
+ next = iter;
+ if (gtk_tree_model_iter_next (model, &next) )
+ gtk_tree_selection_select_iter (selection, &next);
+ else {
+ GtkTreePath *path;
+ path = gtk_tree_model_get_path (model, &iter);
+ if (gtk_tree_path_prev (path))
+ gtk_tree_selection_select_path (selection, path);
+ gtk_tree_path_free (path);
+ }
+ gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+
+}
+
+static void
+selection_changed (GtkTreeSelection *selection, gpointer data)
+{
+ GtkWidget *scrolled = data;
+ GtkWidget *edit_button, *delete_button;
+ gboolean selected;
+
+ selected = gtk_tree_selection_get_selected (selection, NULL, NULL);
+ edit_button = g_object_get_data (G_OBJECT (scrolled), "edit_button");
+ gtk_widget_set_sensitive (edit_button, selected);
+ delete_button = g_object_get_data (G_OBJECT (scrolled), "delete_button");
+ gtk_widget_set_sensitive (delete_button, selected);
+}
+
+static GtkWidget *
+create_palettes_tree (charpick_data *curr_data, GtkWidget *label)
+{
+ GtkWidget *scrolled;
+ GtkWidget *tree;
+ GtkListStore *model;
+ GtkCellRenderer *cell;
+ GtkTreeViewColumn *column;
+ GList *list = curr_data->chartable;
+ GtkTreeSelection *selection;
+
+ scrolled = gtk_scrolled_window_new (NULL,NULL);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
+ tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+ curr_data->pref_tree = tree;
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), tree);
+ gtk_container_add (GTK_CONTAINER (scrolled), tree);
+ set_access_namedesc (tree,
+ _("Palettes list"),
+ _("List of available palettes"));
+ g_object_unref (G_OBJECT (model));
+ cell = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("hello",
+ cell,
+ "text", 0,
+ NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree), FALSE);
+
+ while (list) {
+ GtkTreeIter iter;
+ gchar *charlist = list->data;
+
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, charlist, 1, charlist, -1);
+
+ list = g_list_next (list);
+ }
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
+ g_signal_connect (G_OBJECT (selection), "changed",
+ G_CALLBACK (selection_changed), scrolled);
+
+ return scrolled;
+
+}
+
+static GtkWidget *
+create_hig_catagory (GtkWidget *main_box, gchar *title)
+{
+ GtkWidget *vbox, *vbox2, *hbox;
+ GtkWidget *label;
+ gchar *tmp;
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (main_box), vbox, TRUE, TRUE, 0);
+
+ tmp = g_strdup_printf ("<b>%s</b>", title);
+ label = gtk_label_new (NULL);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_label_set_markup (GTK_LABEL (label), tmp);
+ g_free (tmp);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+
+ label = gtk_label_new (" ");
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
+
+ return vbox2;
+
+}
+
+static void default_chars_frame_create(charpick_data *curr_data)
+{
+ GtkWidget *dialog = curr_data->propwindow;
+ GtkWidget *dbox, *vbox, *vbox1, *vbox2, *vbox3;
+ GtkWidget *hbox;
+ GtkWidget *label;
+ GtkWidget *scrolled;
+ GtkWidget *button;
+
+ dbox = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
+
+ vbox = gtk_vbox_new (FALSE, 18);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+ gtk_box_pack_start (GTK_BOX (dbox), vbox, TRUE, TRUE, 0);
+
+ vbox1 = create_hig_catagory (vbox, _("Character Palette"));
+
+ vbox3 = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (vbox1), vbox3, TRUE, TRUE, 0);
+
+ label = gtk_label_new_with_mnemonic(_("_Palettes:"));
+ gtk_box_pack_start(GTK_BOX(vbox3), label, FALSE, FALSE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_widget_show(label);
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (vbox3), hbox, TRUE, TRUE, 0);
+ scrolled = create_palettes_tree (curr_data, label);
+ gtk_box_pack_start (GTK_BOX (hbox), scrolled, TRUE, TRUE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
+ button = gtk_button_new_from_stock (GTK_STOCK_ADD);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (add_palette), curr_data);
+ set_access_namedesc (button, _("Add button"),
+ _("Click to add a new palette"));
+
+ button = gtk_button_new_from_stock (CHARPICK_STOCK_EDIT);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (edit_palette), curr_data);
+ g_object_set_data (G_OBJECT (scrolled), "edit_button", button);
+ set_access_namedesc (button, _("Edit button"),
+ _("Click to edit the selected palette"));
+
+ button = gtk_button_new_from_stock (GTK_STOCK_DELETE);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (delete_palette), curr_data);
+ g_object_set_data (G_OBJECT (scrolled), "delete_button", button);
+ set_access_namedesc (button, _("Delete button"),
+ _("Click to delete the selected palette"));
+
+ if ( ! key_writable (MATE_PANEL_APPLET (curr_data->applet), "chartable"))
+ gtk_widget_set_sensitive (vbox3, FALSE);
+
+ return;
+}
+
+static void
+phelp_cb (GtkDialog *dialog, gint tab, gpointer data)
+{
+ GError *error = NULL;
+
+ gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (dialog)),
+ "ghelp:char-palette?charpick-prefs",
+ gtk_get_current_event_time (),
+ &error);
+
+ if (error) { /* FIXME: the user needs to see this */
+ g_warning ("help error: %s\n", error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+}
+
+static void
+response_cb (GtkDialog *dialog, gint id, gpointer data)
+{
+ charpick_data *curr_data = data;
+
+ if(id == GTK_RESPONSE_HELP){
+ phelp_cb (dialog,id,data);
+ return;
+ }
+
+ gtk_widget_destroy (curr_data->propwindow);
+ curr_data->propwindow = NULL;
+
+}
+
+void
+show_preferences_dialog (GtkAction *action,
+ charpick_data *curr_data)
+{
+ if (curr_data->propwindow) {
+ gtk_window_set_screen (GTK_WINDOW (curr_data->propwindow),
+ gtk_widget_get_screen (curr_data->applet));
+ gtk_window_present (GTK_WINDOW (curr_data->propwindow));
+ return;
+ }
+
+ curr_data->propwindow = gtk_dialog_new_with_buttons (_("Character Palette Preferences"),
+ NULL,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+ GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+ NULL);
+ gtk_window_set_screen (GTK_WINDOW (curr_data->propwindow),
+ gtk_widget_get_screen (curr_data->applet));
+ gtk_window_set_default_size (GTK_WINDOW (curr_data->propwindow), 350, 350);
+ gtk_container_set_border_width (GTK_CONTAINER (curr_data->propwindow), 5);
+ gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area(GTK_DIALOG (curr_data->propwindow))), 2);
+ gtk_dialog_set_default_response (GTK_DIALOG (curr_data->propwindow), GTK_RESPONSE_CLOSE);
+ gtk_dialog_set_has_separator (GTK_DIALOG (curr_data->propwindow), FALSE);
+
+ default_chars_frame_create(curr_data);
+ g_signal_connect (G_OBJECT (curr_data->propwindow), "response",
+ G_CALLBACK (response_cb), curr_data);
+
+ gtk_widget_show_all (curr_data->propwindow);
+}