*** empty log message ***
[m17n/m17n-im-config.git] / src / variable.c
index 49ff0ec..313744c 100644 (file)
        (current_lang, current_name, current_variable))))))
 
 #define CURRENT_STATUS         \
-  (mplist_next                 \
+  (mplist_value                        \
    (mplist_next                        \
-    (mplist_value              \
-     (minput_get_variable      \
-      (current_lang, current_name, current_variable)))))
+    (mplist_next               \
+     (mplist_value             \
+      (minput_get_variable     \
+       (current_lang, current_name, current_variable))))))
+
+#define CURRENT_DESCRIPTION                                    \
+  (mtext_data                                                  \
+   (mplist_value                                               \
+    (mplist_next                                               \
+     (mplist_value                                             \
+      (minput_get_variable                                     \
+       (current_lang, current_name, current_variable)))),      \
+    NULL,  NULL,  NULL,  NULL))
 
 #define CONFIG_VARIABLE(plist)                                         \
   minput_config_variable (current_lang, current_name, current_variable,        \
@@ -43,17 +53,121 @@ struct ControllerInfo
 
   /* type of widget */
   enum WidgetType wtype;
+
+  /* whether minput_config_variable () should be called on ok button */
+  gboolean need_config;
+
+  /* default button */
+  GtkWidget *default_;
+
+  /* revert button */
+  GtkWidget *revert;
+
+  /* status label */
+  GtkWidget *status;
+
+  /* dialog itself */
+  GtkWidget *dialog;
 };
 
 static MSymbol current_lang, current_name, current_variable;
 
 static void
-entry_cb (GtkEntry *entry, gpointer data)
+update_widget (struct ControllerInfo *ci)
 {
-  const gchar *text = gtk_entry_get_text (entry);
-  MPlist *plist = mplist ();
+  MPlist *plist;
+  MSymbol key, status;
+  void *value;
+
+  plist = CURRENT_VALUE;
+  /* plist == (value [valid-value ...]) */
+  key = mplist_key (plist);
+  value = mplist_value (plist);
+
+  if (ci->wtype == ENTRY_WIDGET)
+    {
+      if (key == Msymbol)
+       gtk_entry_set_text (GTK_ENTRY (ci->widget),
+                           msymbol_name ((MSymbol) value));
+      else if (key == Mtext)           
+       /* Fixme : Assuming the return value is in UTF-8 */
+       gtk_entry_set_text (GTK_ENTRY (ci->widget),
+                           mtext_data ((MText *) value,
+                                       NULL, NULL, NULL, NULL));
+      else                     /* key == Minteger */
+       {
+         gchar buf[32];
+         g_snprintf (buf, sizeof (buf), "%d", (gint) value);
+         gtk_entry_set_text (GTK_ENTRY (ci->widget), buf);
+       }
+    }
+  else if (ci->wtype == COMBO_BOX_WIDGET)
+    {
+      gint i;
+
+      for (i = 0, plist = mplist_next (plist);
+          plist && mplist_key (plist) == key;
+          i++, plist = mplist_next (plist))
+       if (mplist_value (plist) == value)
+         break;
+      gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), i);
+    }
+  else                         /* ci->wtype == SPIN_BUTTON_WIDGET */
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (ci->widget),
+                              (gdouble) (int) value);
+}
+
+static void *
+default_cb (GtkButton *button, gpointer data)
+{
+  MPlist *empty = mplist ();
   struct ControllerInfo *ci = data;
 
+  CONFIG_VARIABLE (empty);
+  m17n_object_unref (empty);
+  update_widget (ci);
+  gtk_widget_set_sensitive (ci->default_, FALSE);
+  if (CURRENT_STATUS == Mconfigured)
+    {
+      gtk_widget_set_sensitive (ci->revert, TRUE);
+      gtk_label_set_text (GTK_LABEL (ci->status), _("modified"));
+    }
+  else
+    {
+      gtk_widget_set_sensitive (ci->revert, FALSE);
+      gtk_label_set_text (GTK_LABEL (ci->status), _("default"));
+    }
+  ci->need_config = FALSE;
+}
+
+static void *
+revert_cb (GtkButton *button, gpointer data)
+{
+  struct ControllerInfo *ci = data;
+
+  CONFIG_VARIABLE (NULL);
+  update_widget (ci);
+  gtk_widget_set_sensitive (ci->revert, FALSE);
+  if (CURRENT_STATUS == Mnil)
+    {
+      gtk_widget_set_sensitive (ci->default_, FALSE);
+      gtk_label_set_text (GTK_LABEL (ci->status), _("default"));
+    }
+  else
+    {
+      gtk_widget_set_sensitive (ci->default_, TRUE);
+      gtk_label_set_text (GTK_LABEL (ci->status), _("customized"));
+    }
+  ci->need_config = FALSE;
+}
+
+static gboolean
+config_with_entry (struct ControllerInfo *ci)
+{
+  const gchar *text = gtk_entry_get_text (GTK_ENTRY (ci->widget));
+  MPlist *plist = mplist ();
+  gboolean ret = TRUE;
+
   if (ci->vtype == Msymbol)
     {
       mplist_add (plist, Msymbol, msymbol (text));
@@ -68,7 +182,7 @@ entry_cb (GtkEntry *entry, gpointer data)
       CONFIG_VARIABLE (plist);
       m17n_object_unref (mt);
     }
-  else if (ci->vtype == Minteger)
+  else                         /* ci->vtype == Minteger */
     {
       int i;
       gchar buf[32];
@@ -83,31 +197,26 @@ entry_cb (GtkEntry *entry, gpointer data)
          GtkWidget *msg;
 
          msg = gtk_message_dialog_new (GTK_WINDOW
-                                       (gtk_widget_get_toplevel (ci->widget)),
+                                       (gtk_widget_get_toplevel (ci->dialog)),
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
                                        GTK_MESSAGE_ERROR,
                                        GTK_BUTTONS_CLOSE,
                                        _("The value must be an integer."));
          gtk_dialog_run (GTK_DIALOG (msg));
          gtk_widget_destroy (msg);
-         /* revert current value */
-         mplist_add (plist, Minteger, mplist_value (CURRENT_VALUE));
+         ret = FALSE;
        }
-      /* redraw the value to get rid of non-digits */
-      g_snprintf (buf, sizeof (buf), "%d", (gint) mplist_value (plist));
-      gtk_entry_set_text (GTK_ENTRY (entry), buf);
-      gtk_editable_set_position (GTK_EDITABLE (entry), -1);
     }
+
   m17n_object_unref (plist);
+  return ret;
 }
 
-static void
-combo_cb (GtkComboBox *combo, gpointer data)
+static gboolean
+config_with_combo (struct ControllerInfo *ci)
 {
-  gchar *text = gtk_combo_box_get_active_text (combo);
+  gchar *text = gtk_combo_box_get_active_text (GTK_COMBO_BOX (ci->widget));
   MPlist *plist = mplist ();
-  struct ControllerInfo *ci = data;
-
 
   if (ci->vtype == Msymbol)
     {
@@ -123,7 +232,7 @@ combo_cb (GtkComboBox *combo, gpointer data)
       CONFIG_VARIABLE (plist);
       m17n_object_unref (mt);
     }
-  else if (ci->vtype == Minteger)
+  else                         /* ci->vtype == Minteger */
     {
       int i;
 
@@ -132,18 +241,63 @@ combo_cb (GtkComboBox *combo, gpointer data)
       CONFIG_VARIABLE (plist);
     }
   m17n_object_unref (plist);
+  return TRUE;
 }
 
-static void
-spin_cb (GtkSpinButton *spin, gpointer data)
+static gboolean
+config_with_spin (struct ControllerInfo *ci)
 {
+  gint i;
+
+  i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ci->widget));
   MPlist *plist = mplist ();
-  struct ControllerInfo *ci = data;
 
-  mplist_add (plist, Minteger,
-             (void *) gtk_spin_button_get_value_as_int (spin));
+  mplist_add (plist, Minteger, (void *) i);
   CONFIG_VARIABLE (plist);
   m17n_object_unref (plist);
+  return TRUE;
+}
+
+static void *
+ok_cb (GtkButton *button, gpointer data)
+{
+  struct ControllerInfo *ci = data;
+
+  if (ci->need_config)
+    {
+      if (ci->wtype == ENTRY_WIDGET)
+       {
+         if (config_with_entry (ci))
+           gtk_dialog_response (GTK_DIALOG (ci->dialog), GTK_RESPONSE_OK);
+         else
+           revert_cb (NULL, ci);
+       }
+
+      else if (ci->wtype == COMBO_BOX_WIDGET)
+       {
+         config_with_combo (ci); /* always returns true */
+         gtk_dialog_response (GTK_DIALOG (ci->dialog), GTK_RESPONSE_OK);
+       }
+
+      else                             /* ci->wtype == SPIN_BUTTON */
+       {
+         config_with_spin (ci); /* always returns true */
+         gtk_dialog_response (GTK_DIALOG (ci->dialog), GTK_RESPONSE_OK);
+       }
+    }
+  else
+    gtk_dialog_response (GTK_DIALOG (ci->dialog), GTK_RESPONSE_OK);
+}
+
+static void
+changed_cb (GtkEntry *entry, gpointer data)
+{
+  struct ControllerInfo *ci = data;
+
+  gtk_widget_set_sensitive (ci->default_, TRUE);
+  gtk_widget_set_sensitive (ci->revert, TRUE);
+  gtk_label_set_text (GTK_LABEL (ci->status), _("modified"));
+  ci->need_config = TRUE;
 }
 
 enum
@@ -161,17 +315,15 @@ set_value_status (GtkListStore *store, GtkTreeIter *iter)
   MSymbol status;
   gchar *value_str, *status_str, buf[32];
 
-  plist = CURRENT_STATUS;
-  /* plist == (status value [valid-value ...]) */
-  status = mplist_value (plist);
-  if (status == Mnil || status == Minherited)
-    status_str = _("default");
+  status = CURRENT_STATUS;
+  if (status == Mconfigured)
+    status_str = _("modified");
   else if (status == Mcustomized)
     status_str = _("customized");
   else
-    status_str = _("modified");
+    status_str = _("default");
 
-  plist = mplist_next (plist);
+  plist = CURRENT_VALUE;
   /* plist == (value [valid-value ...]) */
   if (mplist_key (plist) == Msymbol)
     value_str = msymbol_name ((MSymbol) mplist_value (plist));
@@ -207,9 +359,11 @@ create_widget (struct ControllerInfo *ci)
     {
       if (plist && mplist_key (plist) == Msymbol)
        {
-         gint i, nth = -1;
+         gint i, nth;
 
          ci->widget = gtk_combo_box_new_text ();
+         g_signal_connect (GTK_OBJECT (ci->widget), "changed",
+                           G_CALLBACK (changed_cb), ci);
          ci->wtype = COMBO_BOX_WIDGET;
          for (i = 0; plist && mplist_key (plist) == Msymbol;
               plist = mplist_next (plist), i++)
@@ -220,28 +374,29 @@ create_widget (struct ControllerInfo *ci)
                (GTK_COMBO_BOX (ci->widget),
                 msymbol_name ((MSymbol) mplist_value (plist)));
            }
-         if (nth != -1)
-           gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), nth);
-         g_signal_connect (G_OBJECT (ci->widget), "changed",
-                           G_CALLBACK (combo_cb), ci);
+         gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), nth);
        }
       else
        {
          ci->widget = gtk_entry_new ();
+         g_signal_connect (GTK_OBJECT (ci->widget), "changed",
+                           G_CALLBACK (changed_cb), ci);
+         g_signal_connect (GTK_OBJECT (ci->widget), "activate",
+                           G_CALLBACK (ok_cb), ci);
          ci->wtype = ENTRY_WIDGET;
          gtk_entry_set_text (GTK_ENTRY (ci->widget), msymbol_name (value));
          gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE);
-         g_signal_connect (G_OBJECT (ci->widget), "activate",
-                           G_CALLBACK (entry_cb), ci);
        }
     }
   else if (ci->vtype == Mtext)
     {
       if (plist && mplist_key (plist) == Mtext)
        {
-         gint i, nth = -1;
+         gint i, nth;
 
          ci->widget = gtk_combo_box_new_text ();
+         g_signal_connect (GTK_OBJECT (ci->widget), "changed",
+                           G_CALLBACK (changed_cb), ci);
          ci->wtype = COMBO_BOX_WIDGET;
          for (i = 0; plist && mplist_key (plist) == Mtext;
               plist = mplist_next (plist), i++)
@@ -255,30 +410,31 @@ create_widget (struct ControllerInfo *ci)
                 mtext_data ((MText *) mplist_value (plist),
                             NULL, NULL, NULL, NULL));
            }
-         if (nth != -1)
-           gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), nth);
-         g_signal_connect (G_OBJECT (ci->widget), "changed",
-                           G_CALLBACK (combo_cb), ci);
+         gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), nth);
        }
       else
        {
          ci->widget = gtk_entry_new ();
+         g_signal_connect (GTK_OBJECT (ci->widget), "changed",
+                           G_CALLBACK (changed_cb), ci);
+         g_signal_connect (GTK_OBJECT (ci->widget), "activate",
+                           G_CALLBACK (ok_cb), ci);
          ci->wtype = ENTRY_WIDGET;
          /* Fixme : Assuming the return value is in UTF-8 */
          gtk_entry_set_text (GTK_ENTRY (ci->widget),
                              mtext_data (value, NULL, NULL, NULL, NULL));
          gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE);
-         g_signal_connect (G_OBJECT (ci->widget), "activate",
-                           G_CALLBACK (entry_cb), ci);
        }
     }
-  else if (ci->vtype == Minteger)
+  else                         /* ci->vtype == Minteger */
     {
       if (plist && mplist_key (plist) == Minteger)
        {
-         gint i, nth = -1;
+         gint i, nth;
 
          ci->widget = gtk_combo_box_new_text ();
+         g_signal_connect (GTK_OBJECT (ci->widget), "changed",
+                           G_CALLBACK (changed_cb), ci);
          ci->wtype = COMBO_BOX_WIDGET;
          for (i = 0; plist && mplist_key (plist) == Minteger;
               plist = mplist_next (plist), i++)
@@ -291,10 +447,7 @@ create_widget (struct ControllerInfo *ci)
                          (gint) mplist_value (plist));
              gtk_combo_box_append_text (GTK_COMBO_BOX (ci->widget), buf);
            }
-         if (nth != -1)
-           gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), nth);
-         g_signal_connect (G_OBJECT (ci->widget), "changed",
-                           G_CALLBACK (combo_cb), ci);
+         gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), nth);
        }
       else if (plist && mplist_key (plist) == Mplist)
        {
@@ -307,116 +460,56 @@ create_widget (struct ControllerInfo *ci)
          adj = gtk_adjustment_new ((gdouble) (int) value, lower, upper,
                                    1.0, 10.0, 0);
          ci->widget = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
+         g_signal_connect (GTK_OBJECT (ci->widget), "changed",
+                           G_CALLBACK (changed_cb), ci);
          ci->wtype = SPIN_BUTTON_WIDGET;
          gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (ci->widget), TRUE);
          gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (ci->widget),
-                                            GTK_UPDATE_IF_VALID);
-         g_signal_connect (G_OBJECT (ci->widget), "value_changed",
-                           G_CALLBACK (spin_cb), ci);
+                                            GTK_UPDATE_ALWAYS);
        }
       else
        {
          gchar buf[32];
 
          ci->widget = gtk_entry_new ();
+         g_signal_connect (GTK_OBJECT (ci->widget), "changed",
+                           G_CALLBACK (changed_cb), ci);
+         g_signal_connect (GTK_OBJECT (ci->widget), "activate",
+                           G_CALLBACK (ok_cb), ci);
          ci->wtype = ENTRY_WIDGET;
          g_snprintf (buf, sizeof (buf), "%d", (gint) value);
          gtk_entry_set_text (GTK_ENTRY (ci->widget), buf);
          gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE);
-         g_signal_connect (G_OBJECT (ci->widget), "activate",
-                           G_CALLBACK (entry_cb), ci);
-       }
-    }
-  else
-    {
-      ci->widget = gtk_entry_new ();
-      ci->wtype = ENTRY_WIDGET;
-      gtk_entry_set_text (GTK_ENTRY (ci->widget), "???");
-      gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE);
-      g_signal_connect (G_OBJECT (ci->widget), "activate",
-                       G_CALLBACK (entry_cb), ci);
-    }
-  return ci->widget;
-}
-
-static void
-update_controller (struct ControllerInfo *ci)
-{
-  MPlist *plist;
-  MSymbol key;
-  void *value;
-
-  plist = CURRENT_VALUE;
-  /* plist == (value [valid-value ...]) */
-  key = mplist_key (plist);
-  value = mplist_value (plist);
-
-  if (ci->wtype == ENTRY_WIDGET)
-    {
-      if (key == Msymbol)
-       gtk_entry_set_text (GTK_ENTRY (ci->widget),
-                           msymbol_name ((MSymbol) value));
-      else if (key == Mtext)           
-       /* Fixme : Assuming the return value is in UTF-8 */
-       gtk_entry_set_text (GTK_ENTRY (ci->widget),
-                           mtext_data ((MText *) value,
-                                       NULL, NULL, NULL, NULL));
-      else
-       {
-         gchar buf[32];
-         g_snprintf (buf, sizeof (buf), "%d", (gint) value);
-         gtk_entry_set_text (GTK_ENTRY (ci->widget), buf);
        }
     }
-  else if (ci->wtype == COMBO_BOX_WIDGET)
-    {
-      gint i;
 
-      for (i = 0, plist = mplist_next (plist);
-          plist && mplist_key (plist) == key;
-          i++, plist = mplist_next (plist))
-       if (mplist_value (plist) == value)
-         break;
-      gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), i);
-    }
-  else
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (ci->widget),
-                              (gdouble) (int) value);
-}
-
-static void *
-default_cb (GtkButton *button, gpointer data)
-{
-  MPlist *empty = mplist ();
-
-  CONFIG_VARIABLE (empty);
-  m17n_object_unref (empty);
-  update_controller ((struct ControllerInfo *) data);
-}
-
-static void *
-revert_cb (GtkButton *button, gpointer data)
-{
-  CONFIG_VARIABLE (NULL);
-  update_controller ((struct ControllerInfo *) data);
+  return ci->widget;
 }
 
 static void *
-apply_cb (GtkButton *button, gpointer data)
+help_cb (GtkButton *button, gpointer data)
 {
   struct ControllerInfo *ci = data;
-
-  if (ci->wtype == ENTRY_WIDGET)
-    entry_cb (GTK_ENTRY (ci->widget), ci);
+  GtkWidget *msg;
+
+  msg = gtk_message_dialog_new (GTK_WINDOW
+                               (gtk_widget_get_toplevel (ci->dialog)),
+                               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
-activated_cb (GtkTreeView *parent, GtkTreePath *path,
-             GtkTreeViewColumn *col, gpointer data)
+row_activated_cb (GtkTreeView *parent, GtkTreePath *path,
+                 GtkTreeViewColumn *col, gpointer data)
 {
   GtkTreeModel *model;
   GtkTreeIter iter;
-  GtkWidget *dialog, *default_, *revert, *apply, *hbox, *vbox;
+  GtkWidget *label, *ok, *help, *hbox, *vbox;
+  MSymbol status;
   struct ControllerInfo ci;
   gchar *variable;
 
@@ -426,48 +519,87 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path,
   gtk_tree_model_get (model, &iter, VCOL_VARIABLE, &variable, -1);
   current_variable = msymbol (variable);
 
-  dialog = (gtk_dialog_new_with_buttons
-           (variable,
-            GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent))),
-            GTK_DIALOG_DESTROY_WITH_PARENT,
-            GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
-            NULL));
-
-  default_ = gtk_button_new_from_stock (_("_Default"));
-  g_signal_connect (G_OBJECT (default_), "clicked",
+  ci.dialog = (gtk_dialog_new_with_buttons
+              (variable,
+               GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent))),
+               GTK_DIALOG_DESTROY_WITH_PARENT,
+               NULL));
+  
+  ci.default_ = gtk_button_new_from_stock (_("_Default"));
+  g_signal_connect (G_OBJECT (ci.default_), "clicked",
                    G_CALLBACK (default_cb), &ci);
 
-  revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
-  g_signal_connect (G_OBJECT (revert), "clicked",
+  ci.revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
+  g_signal_connect (G_OBJECT (ci.revert), "clicked",
                    G_CALLBACK (revert_cb), &ci);
 
-  apply = gtk_button_new_from_stock (GTK_STOCK_APPLY);
-  g_signal_connect (G_OBJECT (apply), "clicked",
-                   G_CALLBACK (apply_cb), &ci);
+  label = gtk_label_new (_("Status : "));
+  ci.status = gtk_label_new (NULL);
+
+  ok = gtk_button_new_from_stock (GTK_STOCK_OK);
+  g_signal_connect (G_OBJECT (ok), "clicked",
+                   G_CALLBACK (ok_cb), &ci);
 
-  vbox = gtk_vbox_new (FALSE, 6);
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
-  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
+  help = gtk_button_new_from_stock (GTK_STOCK_HELP);
+  g_signal_connect (G_OBJECT (help), "clicked",
+                   G_CALLBACK (help_cb), &ci);
+
+  vbox = gtk_vbox_new (FALSE, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (ci.dialog)->vbox), vbox);
 
   gtk_container_add (GTK_CONTAINER (vbox), create_widget (&ci));
 
   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), apply);
+  gtk_container_add (GTK_CONTAINER (hbox), ci.default_);
+  gtk_container_add (GTK_CONTAINER (hbox), ci.revert);
+  gtk_container_add (GTK_CONTAINER (vbox), hbox);
+
+  hbox = gtk_hbox_new (FALSE, 6);
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), ci.status, FALSE, FALSE, 0);
   gtk_container_add (GTK_CONTAINER (vbox), hbox);
-                     
-  gtk_widget_show_all (dialog);
-  gtk_dialog_run (GTK_DIALOG (dialog));
+
+  gtk_button_box_set_layout
+    (GTK_BUTTON_BOX (GTK_DIALOG (ci.dialog)->action_area),
+     GTK_BUTTONBOX_EDGE);
+  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (ci.dialog)->action_area),
+                    help);
+  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (ci.dialog)->action_area),
+                    ok);
+
+  status = CURRENT_STATUS;
+  if (status == Mconfigured)
+    {
+      gtk_widget_set_sensitive (ci.default_, TRUE);
+      gtk_widget_set_sensitive (ci.revert, TRUE);
+      gtk_label_set_text (GTK_LABEL (ci.status), _("modified"));
+    }
+  else if (status == Mcustomized)
+    {
+      gtk_widget_set_sensitive (ci.default_, TRUE);
+      gtk_widget_set_sensitive (ci.revert, FALSE);
+      gtk_label_set_text (GTK_LABEL (ci.status), _("customized"));
+    }
+  else
+    {
+      gtk_widget_set_sensitive (ci.default_, FALSE);
+      gtk_widget_set_sensitive (ci.revert, FALSE);
+      gtk_label_set_text (GTK_LABEL (ci.status), _("default"));
+    }
+
+  ci.need_config = FALSE;
+
+  gtk_widget_show_all (ci.dialog);
+  gtk_dialog_run (GTK_DIALOG (ci.dialog));
   gtk_tree_model_get_iter (model, &iter, path);
   set_value_status (GTK_LIST_STORE (model), &iter);
-  gtk_widget_destroy (dialog);
+  gtk_widget_destroy (ci.dialog);
 }
 
 GtkWidget *
-create_variable_entries (GtkTooltips *tip, MSymbol lang, MSymbol name)
+create_variable_list (MSymbol lang, MSymbol name)
 {
   GtkListStore *store;
   GtkWidget *view;
@@ -545,6 +677,6 @@ create_variable_entries (GtkTooltips *tip, MSymbol lang, MSymbol name)
                                               VCOL_STATUS,
                                               NULL);
   g_signal_connect (G_OBJECT (view), "row-activated",
-                   G_CALLBACK (activated_cb), NULL);
+                   G_CALLBACK (row_activated_cb), NULL);
   return view;
 }