*** empty log message ***
[m17n/m17n-im-config.git] / src / command.c
index ccf85c9..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))
@@ -45,13 +54,13 @@ static MSymbol current_lang, current_name, current_command;
 
 struct BindingWidgets
 {
-  GtkWidget *entry;
-  GtkWidget *clear;
-  GtkWidget *add;
   GtkWidget *view;
   GtkWidget *default_;
   GtkWidget *revert;
   GtkWidget *delete;
+  GtkWidget *entry;
+  GtkWidget *clear;
+  GtkWidget *add;
   GtkWidget *status;
 };
 
@@ -214,19 +223,16 @@ update_widgets (struct BindingWidgets *bw)
     {
       gtk_widget_set_sensitive (bw->default_, TRUE);
       gtk_widget_set_sensitive (bw->revert, TRUE);
-      gtk_label_set_text (GTK_LABEL (bw->status), _("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), _("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), _("Status : default"));
     }
 }
 
@@ -281,7 +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);
-  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 *
@@ -370,7 +378,17 @@ default_cb (GtkButton *button, gpointer data)
   CONFIG_COMMAND (empty);
   m17n_object_unref (empty);
   update_binding_store (bw->view);
-  update_widgets (bw);
+  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 *
@@ -380,7 +398,17 @@ revert_cb (GtkButton *button, gpointer data)
 
   CONFIG_COMMAND (NULL);
   update_binding_store (bw->view);
-  update_widgets (bw);
+  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
@@ -407,6 +435,9 @@ delete_cb (GtkButton *button, gpointer data)
   gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
   update_binding_store (bw->view);
   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 *
@@ -479,6 +510,22 @@ create_deleting_section (struct BindingWidgets *bw)
   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)
 {
@@ -501,7 +548,8 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path,
 {
   GtkTreeModel *model;
   GtkTreeIter iter;
-  GtkWidget *dialog, *vbox, *hbox;
+  GtkWidget *dialog, *label, *help, *vbox, *hbox;
+  MSymbol status;
   struct BindingWidgets bw;
   gchar *command;
 
@@ -511,12 +559,30 @@ 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_DIALOG_NO_SEPARATOR,
+            GTK_DIALOG_DESTROY_WITH_PARENT,
             GTK_STOCK_OK, GTK_RESPONSE_OK,
             NULL));
+  */
+  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));
@@ -526,13 +592,37 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path,
 
   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);
-  bw.status = gtk_label_new (NULL);
-  gtk_box_pack_start (GTK_BOX (hbox), bw.status, FALSE, FALSE, 6);
   gtk_container_add (GTK_CONTAINER (vbox), hbox);
-  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
 
-  update_widgets (&bw);
+  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);