*** empty log message ***
[m17n/m17n-im-config.git] / src / command.c
index c53a5eb..49d1ad8 100644 (file)
       (minput_get_command      \
        (current_lang, current_name, current_command))))))
 
+#define CURRENT_DESCRIPTION                                    \
+  (mtext_data                                                  \
+   (mplist_value                                               \
+    (mplist_next                                               \
+     (mplist_value                                             \
+      (minput_get_command                                      \
+       (current_lang, current_name, current_command)))),       \
+    NULL,  NULL,  NULL,  NULL))
+
 #define CONFIG_COMMAND(plist)                                          \
   minput_config_command (current_lang, current_name, current_command,  \
                         (plist))
 
+static void
+mtext__cat_str (MText *mt, char *str)
+{
+  while (*str)
+    {
+      mtext_cat_char (mt, (int) *str);
+      str++;
+    }
+}
+
 static unsigned modifier_state = 0;
 static MPlist *entry_keyseq;
 static MSymbol current_lang, current_name, current_command;
 
 struct BindingWidgets
 {
+  GtkWidget *view;
+  GtkWidget *default_;
+  GtkWidget *revert;
+  GtkWidget *delete;
   GtkWidget *entry;
   GtkWidget *clear;
   GtkWidget *add;
-  GtkWidget *view;
-  GtkWidget *delete;
+  GtkWidget *status;
 };
 
 enum KeyMaskBit {
@@ -106,7 +128,7 @@ update_binding_store (GtkWidget *view)
     }
 }
 
-gboolean
+static gboolean
 key_pressed_cb (GtkEntry *entry, GdkEventKey *event, gpointer data)
 {
   guint c;
@@ -169,7 +191,7 @@ key_pressed_cb (GtkEntry *entry, GdkEventKey *event, gpointer data)
   return TRUE;
 }
 
-gboolean
+static gboolean
 key_released_cb (GtkEntry *entry, GdkEventKey *event, gpointer data)
 {
   guint c;
@@ -193,6 +215,28 @@ key_released_cb (GtkEntry *entry, GdkEventKey *event, gpointer data)
 }
 
 static void
+update_widgets (struct BindingWidgets *bw)
+{
+  MSymbol status = CURRENT_STATUS;
+
+  if (status == Mconfigured)
+    {
+      gtk_widget_set_sensitive (bw->default_, TRUE);
+      gtk_widget_set_sensitive (bw->revert, TRUE);
+    }
+  else if (status == Mcustomized)
+    {
+      gtk_widget_set_sensitive (bw->default_, TRUE);
+      gtk_widget_set_sensitive (bw->revert, FALSE);
+    }
+  else
+    {
+      gtk_widget_set_sensitive (bw->default_, FALSE);
+      gtk_widget_set_sensitive (bw->revert, FALSE);
+    }
+}
+
+static void
 clear_cb (GtkButton *button, gpointer data)
 {
   struct BindingWidgets *bw = data;
@@ -243,8 +287,9 @@ add_cb (GtkButton *button, gpointer data)
   gtk_list_store_set (store, &iter, 0, mplist_value (last), -1);
   update_binding_store (bw->view);
   clear_cb (NULL, bw);
-  gtk_widget_set_sensitive (bw->clear, FALSE);
-  gtk_widget_set_sensitive (bw->add, FALSE);
+  gtk_widget_set_sensitive (bw->default_, TRUE);
+  gtk_widget_set_sensitive (bw->revert, TRUE);
+  gtk_label_set_text (GTK_LABEL (bw->status), _("modified"));
 }
 
 static GtkWidget *
@@ -271,8 +316,8 @@ create_adding_section (struct BindingWidgets *bw)
   g_signal_connect (G_OBJECT (bw->add), "clicked",
                    G_CALLBACK (add_cb), bw);
 
-  vbox = gtk_vbox_new (FALSE, 6);
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
+  vbox = gtk_vbox_new (FALSE, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
 
   hbox = gtk_hbox_new (FALSE, 6);
   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
@@ -309,32 +354,19 @@ keyseq_render_function (GtkTreeViewColumn *column,
 {
   MPlist *keyseq, *pl;
   gint n;
-  gchar buf[1024];
+  MText *mt = mtext ();
 
   gtk_tree_model_get (model, iter, 0, &keyseq, -1);
-  for (pl = keyseq, n = 0;
+  for (pl = keyseq;
        pl && mplist_key (pl) == Msymbol;
        pl = mplist_next (pl))
-    n += strlen (msymbol_name ((MSymbol) mplist_value (pl))) + 1;
-  if (n < sizeof (buf))
-    {
-      buf[0] = '\0';
-      for (pl = keyseq;
-          pl && mplist_key (pl) == Msymbol;
-          pl = mplist_next (pl))
-       {
-         strcat (buf, msymbol_name ((MSymbol) mplist_value (pl)));
-         strcat (buf, " ");
-       }
-      g_object_set (renderer, "foreground-set", FALSE, NULL);
-    }
-  else
     {
-      g_snprintf (buf, sizeof (buf), _("Too long to display"));
-      g_object_set (renderer, "foreground", "Red", "foreground-set", TRUE,
-                   NULL);
+      mtext__cat_str (mt, msymbol_name ((MSymbol) mplist_value (pl)));
+      mtext_cat_char (mt, ' ');
     }
-  g_object_set (renderer, "text", buf, NULL);
+  g_object_set (renderer, "text", mtext_data (mt, NULL, NULL, NULL, NULL),
+               NULL);
+  m17n_object_unref (mt);    
 }
 
 static void *
@@ -346,6 +378,17 @@ default_cb (GtkButton *button, gpointer data)
   CONFIG_COMMAND (empty);
   m17n_object_unref (empty);
   update_binding_store (bw->view);
+  gtk_widget_set_sensitive (bw->default_, FALSE);
+  if (CURRENT_STATUS == Mconfigured)
+    {
+      gtk_widget_set_sensitive (bw->revert, TRUE);
+      gtk_label_set_text (GTK_LABEL (bw->status), _("modified"));
+    }
+  else
+    {
+      gtk_widget_set_sensitive (bw->revert, FALSE);
+      gtk_label_set_text (GTK_LABEL (bw->status), _("default"));
+    }
 }
 
 static void *
@@ -355,6 +398,17 @@ revert_cb (GtkButton *button, gpointer data)
 
   CONFIG_COMMAND (NULL);
   update_binding_store (bw->view);
+  gtk_widget_set_sensitive (bw->revert, FALSE);
+  if (CURRENT_STATUS == Mnil)
+    {
+      gtk_widget_set_sensitive (bw->default_, FALSE);
+      gtk_label_set_text (GTK_LABEL (bw->status), _("default"));
+    }
+  else
+    {
+      gtk_widget_set_sensitive (bw->default_, TRUE);
+      gtk_label_set_text (GTK_LABEL (bw->status), _("customized"));
+    }
 }
 
 static void
@@ -380,23 +434,29 @@ delete_cb (GtkButton *button, gpointer data)
   m17n_object_unref (new);
   gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
   update_binding_store (bw->view);
-  gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
+  update_widgets (bw);
+  gtk_widget_set_sensitive (bw->default_, TRUE);
+  gtk_widget_set_sensitive (bw->revert, TRUE);
+  gtk_label_set_text (GTK_LABEL (bw->status), _("modified"));
 }
 
 static GtkWidget *
 create_deleting_section (struct BindingWidgets *bw)
 {
   GtkListStore *store;
-  GtkWidget *scrolled, *default_, *revert, *delete, *hbox, *vbox;
+  GtkWidget *label, *scrolled, *hbox, *vbox;
   GtkTreeViewColumn *column;
   GtkCellRenderer *renderer;
   GtkTreeIter iter;
   GtkTreeSelection *selection;
   MPlist *pl;
 
+  label = gtk_label_new (_("Current key bindings:"));
+
   store = gtk_list_store_new (1, G_TYPE_POINTER);
   bw->view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
   g_object_unref (G_OBJECT (store));
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (bw->view), FALSE);
   update_binding_store (bw->view);
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(bw->view));
   gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
@@ -410,7 +470,6 @@ create_deleting_section (struct BindingWidgets *bw)
                                         bw->view);
 
   column = gtk_tree_view_column_new ();
-  gtk_tree_view_column_set_title (column, _("Current Key Bindings"));
   gtk_tree_view_append_column (GTK_TREE_VIEW (bw->view), column);
 
   renderer = gtk_cell_renderer_text_new ();
@@ -418,12 +477,12 @@ create_deleting_section (struct BindingWidgets *bw)
   gtk_tree_view_column_set_cell_data_func
     (column, renderer, keyseq_render_function, NULL, NULL);
 
-  default_ = gtk_button_new_from_stock (_("_Default"));
-  g_signal_connect (G_OBJECT (default_), "clicked",
+  bw->default_ = gtk_button_new_from_stock (_("_Default"));
+  g_signal_connect (G_OBJECT (bw->default_), "clicked",
                    G_CALLBACK (default_cb), bw);
 
-  revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
-  g_signal_connect (G_OBJECT (revert), "clicked",
+  bw->revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
+  g_signal_connect (G_OBJECT (bw->revert), "clicked",
                    G_CALLBACK (revert_cb), bw);
 
   bw->delete = gtk_button_new_from_stock (GTK_STOCK_DELETE);
@@ -431,22 +490,42 @@ create_deleting_section (struct BindingWidgets *bw)
   g_signal_connect (G_OBJECT (bw->delete), "clicked",
                    G_CALLBACK (delete_cb), bw);
 
-  vbox = gtk_vbox_new (FALSE, 6);
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
+  vbox = gtk_vbox_new (FALSE, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+
+  hbox = gtk_hbox_new (FALSE, 6);
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
+  gtk_container_add (GTK_CONTAINER (vbox), hbox);
 
   gtk_container_add (GTK_CONTAINER (vbox), scrolled);
 
   hbox = gtk_hbutton_box_new ();
   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END);
   gtk_box_set_spacing (GTK_BOX (hbox), 6);
-  gtk_container_add (GTK_CONTAINER (hbox), default_);
-  gtk_container_add (GTK_CONTAINER (hbox), revert);
+  gtk_container_add (GTK_CONTAINER (hbox), bw->default_);
+  gtk_container_add (GTK_CONTAINER (hbox), bw->revert);
   gtk_container_add (GTK_CONTAINER (hbox), bw->delete);
   gtk_container_add (GTK_CONTAINER (vbox), hbox);
 
   return vbox;
 }
 
+static void *
+help_cb (GtkButton *button, gpointer data)
+{
+  struct BindingWidgets *bw = data;
+  GtkWidget *msg;
+
+  msg = gtk_message_dialog_new (GTK_WINDOW
+                               (gtk_widget_get_toplevel (bw->view)),
+                               GTK_DIALOG_DESTROY_WITH_PARENT,
+                               GTK_MESSAGE_INFO,
+                               GTK_BUTTONS_CLOSE,
+                               CURRENT_DESCRIPTION);
+  gtk_dialog_run (GTK_DIALOG (msg));
+  gtk_widget_destroy (msg);
+}
+
 static void
 set_status (GtkListStore *store, GtkTreeIter *iter)
 {
@@ -454,12 +533,12 @@ set_status (GtkListStore *store, GtkTreeIter *iter)
   gchar *status_str;
 
   status = CURRENT_STATUS;
-  if (status == Mnil || status == Minherited)
-    status_str = _("default");
+  if (status == Mconfigured)
+    status_str = _("modified");
   else if (status == Mcustomized)
     status_str = _("customized");
   else
-    status_str = _("modified");
+    status_str = _("default");
   gtk_list_store_set (store, iter, 1, status_str, -1);
 }
 
@@ -469,7 +548,8 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path,
 {
   GtkTreeModel *model;
   GtkTreeIter iter;
-  GtkWidget *dialog;
+  GtkWidget *dialog, *label, *help, *vbox, *hbox;
+  MSymbol status;
   struct BindingWidgets bw;
   gchar *command;
 
@@ -479,17 +559,70 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path,
   gtk_tree_model_get (model, &iter, 0, &command, -1);
   current_command = msymbol (command);
 
+  /*
   dialog = (gtk_dialog_new_with_buttons
            (command,
             GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent))),
             GTK_DIALOG_DESTROY_WITH_PARENT,
-            GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+            GTK_STOCK_OK, GTK_RESPONSE_OK,
             NULL));
-  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
-                    create_adding_section (&bw));
+  */
+  dialog = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (dialog), command);
+  gtk_window_set_transient_for
+    (GTK_WINDOW (dialog),
+     GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent))));
+  gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (GTK_DIALOG (dialog)->action_area),
+                            GTK_BUTTONBOX_EDGE);
+
+  help = gtk_button_new_from_stock (GTK_STOCK_HELP);
+  g_signal_connect (G_OBJECT (help), "clicked",
+                   G_CALLBACK (help_cb), &bw);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
+                     help, FALSE, FALSE, 0);
+
+  gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_OK);
+
   gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
                     create_deleting_section (&bw));
 
+  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
+                    create_adding_section (&bw));
+
+  vbox = gtk_vbox_new (FALSE, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
+
+  hbox = gtk_hbox_new (FALSE, 6);
+  gtk_container_add (GTK_CONTAINER (vbox), hbox);
+
+  label = gtk_label_new (_("Status : "));
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+  bw.status = gtk_label_new (NULL);
+  gtk_box_pack_start (GTK_BOX (hbox), bw.status, FALSE, FALSE, 0);
+
+  status = CURRENT_STATUS;
+  if (status == Mconfigured)
+    {
+      gtk_widget_set_sensitive (bw.default_, TRUE);
+      gtk_widget_set_sensitive (bw.revert, TRUE);
+      gtk_label_set_text (GTK_LABEL (bw.status), _("modified"));
+    }
+  else if (status == Mcustomized)
+    {
+      gtk_widget_set_sensitive (bw.default_, TRUE);
+      gtk_widget_set_sensitive (bw.revert, FALSE);
+      gtk_label_set_text (GTK_LABEL (bw.status), _("customized"));
+    }
+  else
+    {
+      gtk_widget_set_sensitive (bw.default_, FALSE);
+      gtk_widget_set_sensitive (bw.revert, FALSE);
+      gtk_label_set_text (GTK_LABEL (bw.status), _("default"));
+    }
+
   gtk_widget_show_all (dialog);
   gtk_dialog_run (GTK_DIALOG (dialog));
   gtk_tree_model_get_iter (model, &iter, path);
@@ -499,7 +632,7 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path,
 }
 
 GtkWidget *
-create_command_entries (GtkTooltips *tip, MSymbol lang, MSymbol name)
+create_command_list (MSymbol lang, MSymbol name)
 {
   GtkListStore *store;
   GtkWidget *view;