Initial work converting gregedit to python.
authorJelmer Vernooij <jelmer@samba.org>
Sun, 5 Oct 2008 15:15:55 +0000 (17:15 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Sun, 5 Oct 2008 15:15:55 +0000 (17:15 +0200)
.gitignore
Makefile
gepdump [changed mode: 0644->0755]
gregedit [new file with mode: 0755]
tools/gregedit.c [deleted file]

index 0e3e731e375f9ad7f6cdce5b15affa04e237718f..4a4458834c27a492fcc7fd94a4580d5ece58fef4 100644 (file)
@@ -7,7 +7,6 @@ configure
 tags
 libsamba-gtk.so.*
 gtksamba.pc
-gregedit
 gwcrontab
 gwsam
 gwsvcctl
index 0e1fc96a763e37edb4fa64f40cbf0207fea30c8e..070c90d2d8dfbd8afedbed1398d8db285e162d38 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,7 @@
 include Makefile.settings
 
-BINS = gregedit gwcrontab gwsam gwsvcctl 
-SCRIPTS = gtkldb gepdump
-gregedit_LIBS = $(REGISTRY_LIBS)
+BINS = gwcrontab gwsam gwsvcctl 
+SCRIPTS = gtkldb gepdump gregedit
 gwcrontab_LIBS = $(DCERPC_ATSVC_LIBS)
 CFLAGS = $(GTK_CFLAGS) $(TALLOC_CFLAGS) $(DCERPC_CFLAGS) $(GENSEC_CFLAGS) -I. -Wall
 LIBS = $(GTK_LIBS) $(TALLOC_LIBS) $(DCERPC_LIBS) $(GENSEC_LIBS) $(DCERPC_SAMR_LIBS)
diff --git a/gepdump b/gepdump
old mode 100644 (file)
new mode 100755 (executable)
index ed9ed10..1e312d0
--- a/gepdump
+++ b/gepdump
@@ -1,3 +1,4 @@
+#!/usr/bin/python
 #   Unix SMB/CIFS implementation.
 #   GTK+ Endpoint Mapper frontend
 #   
diff --git a/gregedit b/gregedit
new file mode 100755 (executable)
index 0000000..1a754ee
--- /dev/null
+++ b/gregedit
@@ -0,0 +1,730 @@
+#!/usr/bin/python
+#
+#   Unix SMB/CIFS implementation.
+#   GTK+ registry frontend
+#   
+#   Copyright (C) Jelmer Vernooij 2004-2005
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 3 of the License, or
+#   (at your option) any later version.
+#   
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#   
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+import samba.gtk
+from samba import registry
+
+class FindDialog(gtk.Dialog):
+       def _create(self):
+               gtk_window_set_title (GTK_WINDOW (FindDialog), "Find Key or Value")
+               gtk_window_set_resizable (GTK_WINDOW (FindDialog), False)
+               gtk_window_set_type_hint (GTK_WINDOW (FindDialog), GDK_WINDOW_TYPE_HINT_DIALOG)
+
+               dialog_vbox2 = GTK_DIALOG (FindDialog).vbox
+
+               vbox1 = gtk_vbox_new (False, 0)
+               gtk_box_pack_start (GTK_BOX (dialog_vbox2), vbox1, True, True, 0)
+
+               hbox1 = gtk_hbox_new (False, 0)
+               gtk_box_pack_start (GTK_BOX (vbox1), hbox1, True, True, 0)
+
+               label6 = gtk_label_new ("Find String")
+               gtk_box_pack_start (GTK_BOX (hbox1), label6, False, False, 0)
+
+               entry_pattern = gtk_entry_new ()
+               gtk_box_pack_start (GTK_BOX (hbox1), entry_pattern, True, True, 0)
+
+               frame3 = gtk_frame_new (NULL)
+               gtk_box_pack_start (GTK_BOX (vbox1), frame3, True, True, 0)
+               gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_NONE)
+
+               alignment3 = gtk_alignment_new (0.5, 0.5, 1, 1)
+               gtk_container_add (GTK_CONTAINER (frame3), alignment3)
+               gtk_alignment_set_padding (GTK_ALIGNMENT (alignment3), 0, 0, 12, 0)
+
+               vbox2 = gtk_vbox_new (False, 0)
+               gtk_container_add (GTK_CONTAINER (alignment3), vbox2)
+
+               checkbutton1 = gtk_check_button_new_with_mnemonic ("_Key Names")
+               gtk_box_pack_start (GTK_BOX (vbox2), checkbutton1, False, False, 0)
+
+               checkbutton2 = gtk_check_button_new_with_mnemonic ("_Value Names")
+               gtk_box_pack_start (GTK_BOX (vbox2), checkbutton2, False, False, 0)
+
+               checkbutton3 = gtk_check_button_new_with_mnemonic ("Value _Data")
+               gtk_box_pack_start (GTK_BOX (vbox2), checkbutton3, False, False, 0)
+
+               label7 = gtk_label_new ("<b>Search in</b>")
+               gtk_frame_set_label_widget (GTK_FRAME (frame3), label7)
+               gtk_label_set_use_markup (GTK_LABEL (label7), True)
+
+               dialog_action_area2 = GTK_DIALOG (FindDialog).action_area
+               gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END)
+
+               cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel")
+               gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog), cancelbutton2, GTK_RESPONSE_CANCEL)
+               GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT)
+
+               okbutton2 = gtk_button_new_from_stock ("gtk-ok")
+               gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog), okbutton2, GTK_RESPONSE_OK)
+               GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT)
+
+               gtk_widget_show_all (dialog_vbox2)
+
+               return FindDialog
+
+
+class SetValueDialog(gtk.Dialog):
+               SetValueDialog = gtk_dialog_new ()
+               gtk_window_set_title (GTK_WINDOW (SetValueDialog), "Set Registry Value")
+               gtk_window_set_position (GTK_WINDOW (SetValueDialog), GTK_WIN_POS_CENTER)
+               gtk_window_set_resizable (GTK_WINDOW (SetValueDialog), False)
+               gtk_window_set_type_hint (GTK_WINDOW (SetValueDialog), GDK_WINDOW_TYPE_HINT_DIALOG)
+
+               dialog_vbox1 = GTK_DIALOG (SetValueDialog).vbox
+
+               table1 = gtk_table_new (3, 2, False)
+               gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, True, True, 0)
+
+               label3 = gtk_label_new ("Value name:")
+               gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 0, 1,
+                                               (GtkAttachOptions) (GTK_FILL),
+                                               (GtkAttachOptions) (0), 0, 0)
+               gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5)
+
+               label4 = gtk_label_new ("Data Type:")
+               gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 1, 2,
+                                               (GtkAttachOptions) (GTK_FILL),
+                                               (GtkAttachOptions) (0), 0, 0)
+               gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5)
+
+               label5 = gtk_label_new ("Data:")
+               gtk_table_attach (GTK_TABLE (table1), label5, 0, 1, 2, 3,
+                                               (GtkAttachOptions) (GTK_FILL),
+                                               (GtkAttachOptions) (0), 0, 0)
+               gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5)
+
+               *entry_name = entry_value_name = gtk_entry_new ()
+               gtk_table_attach (GTK_TABLE (table1), entry_value_name, 1, 2, 0, 1,
+                                               (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                                               (GtkAttachOptions) (0), 0, 0)
+
+               *entry_data = value_data = gtk_entry_new ()
+               gtk_table_attach (GTK_TABLE (table1), value_data, 1, 2, 2, 3,
+                                               (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                                               (GtkAttachOptions) (0), 0, 0)
+
+               *entry_type = combo_data_type = gtk_combo_box_new_text ()
+
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_NONE")
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_SZ")
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_EXPAND_SZ")
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_BINARY")
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_DWORD_LE")
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_DWORD_BE")
+
+               gtk_table_attach (GTK_TABLE (table1), combo_data_type, 1, 2, 1, 2,
+                                               (GtkAttachOptions) (GTK_FILL),
+                                               (GtkAttachOptions) (GTK_FILL), 0, 0)
+
+               dialog_action_area1 = GTK_DIALOG (SetValueDialog).action_area
+               gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END)
+
+               cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel")
+               gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog), cancelbutton1, GTK_RESPONSE_CANCEL)
+               GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT)
+
+               okbutton1 = gtk_button_new_from_stock ("gtk-ok")
+               gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog), okbutton1, GTK_RESPONSE_OK)
+               GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT)
+
+               gtk_widget_show_all (dialog_vbox1)
+
+
+
+class NewKeyDialog(gtk.Dialog):
+       def _create(self):
+               NewKeyDialog = gtk_dialog_new ()
+               gtk_window_set_title (GTK_WINDOW (NewKeyDialog), "New Registry Key")
+               gtk_window_set_position (GTK_WINDOW (NewKeyDialog), GTK_WIN_POS_CENTER)
+               gtk_window_set_resizable (GTK_WINDOW (NewKeyDialog), False)
+               gtk_window_set_type_hint (GTK_WINDOW (NewKeyDialog), GDK_WINDOW_TYPE_HINT_DIALOG)
+
+               dialog_vbox2 = GTK_DIALOG (NewKeyDialog).vbox
+
+               hbox1 = gtk_hbox_new (False, 0)
+               gtk_box_pack_start (GTK_BOX (dialog_vbox2), hbox1, True, True, 0)
+
+               label6 = gtk_label_new ("Name:")
+               gtk_box_pack_start (GTK_BOX (hbox1), label6, False, False, 0)
+
+               entry_key_name = gtk_entry_new ()
+               gtk_box_pack_start (GTK_BOX (hbox1), entry_key_name, True, True, 0)
+
+               dialog_action_area2 = GTK_DIALOG (NewKeyDialog).action_area
+               gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END)
+
+               *name_entry = entry_key_name
+
+               cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel")
+               gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog), cancelbutton2, GTK_RESPONSE_CANCEL)
+               GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT)
+
+               okbutton2 = gtk_button_new_from_stock ("gtk-ok")
+               gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog), okbutton2, GTK_RESPONSE_OK)
+               GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT)
+
+               gtk_widget_show_all (dialog_vbox2)
+
+               return NewKeyDialog
+
+def expand_key(treeview, parent, arg2):
+       GtkTreeIter firstiter, iter, tmpiter
+       struct registry_key *k, *sub
+       const char *subname
+       char *name
+       WERROR error
+       int i
+
+       gtk_tree_model_iter_children(GTK_TREE_MODEL(store_keys), &firstiter, parent)
+
+       # See if this row has ever had a name gtk_tree_store_set()'ed to it.
+    #             If not, read the directory contents 
+       gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &firstiter, 0, &name, -1)
+
+       if (name != NULL)
+               return
+
+       gtk_tree_model_get(GTK_TREE_MODEL(store_keys), parent, 1, &k, -1)
+
+       g_assert(k)
+       
+       for(i = 0; W_ERROR_IS_OK(error = reg_key_get_subkey_by_index( k, i, &subname, NULL, NULL)); i++) {
+               uint32_t count
+
+               error = reg_open_key(k, subname, &sub)
+
+               if (!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) { 
+                       gtk_show_werror(mainwin, "While enumerating subkeys", error)
+                       return
+               }
+
+               # Replace the blank child with the first directory entry
+        # You may be tempted to remove the blank child node and then 
+        # append a new one.  Don't.  If you remove the blank child 
+        # node GTK gets confused and won't expand the parent row. 
+
+               if i == 0:
+                       iter = firstiter
+               else:
+                       gtk_tree_store_append(store_keys, &iter, parent)
+               gtk_tree_store_set(store_keys, &iter, 
+                                               0, subname,
+                                               1, sub,
+                                               -1)
+               
+               if (W_ERROR_IS_OK(reg_key_get_info(sub, NULL, &count, NULL, NULL, NULL, NULL, NULL)) && count > 0) 
+                       gtk_tree_store_append(store_keys, &tmpiter, &iter)
+       }
+
+       if (!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) { 
+               gtk_show_werror(mainwin, "While enumerating subkeys", error)
+       }
+
+       def load_hive(self, root, name):
+               store_vals.clear()
+
+               # Add the root */
+               store_keys.append(0, name or "", 1, root, -1)
+
+               save.set_sensitive(True)
+               save_as.set_sensitive(True)
+
+       def load_root(self):
+               if registry is None:
+                       return
+               store_vals.clear()
+               store_keys.clear()
+
+               for(i = HKEY_CLASSES_ROOT; i <= HKEY_PERFORMANCE_NLSTEXT; i++) 
+               {
+                       if (!W_ERROR_IS_OK(reg_get_predefined_key(registry, i, &root))) { continue; }
+
+                       self.load_hive(root, reg_get_predef_name(i))
+               }
+
+       def on_open_file_activate (self, menuitem):
+       {
+               GtkWidget *openfilewin
+               gint result
+               char *filename, *tmp
+               struct hive_key *hive_root
+               struct registry_key *reg_root
+               WERROR error
+
+               openfilewin = create_openfilewin(NULL)
+
+               result = gtk_dialog_run(GTK_DIALOG(openfilewin))
+
+               switch(result) {
+               case GTK_RESPONSE_ACCEPT:
+                       filename = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(openfilewin)))
+                       error = reg_open_hive(NULL, filename, NULL, NULL, gtk_event_context(), lp_ctx, &hive_root)
+                       if (!W_ERROR_IS_OK(error)) {
+                               gtk_show_werror(mainwin, "Error while opening hive", error)
+                               break
+                       }
+
+                       reg_root = reg_import_hive_key(registry, hive_root, -1, NULL)
+
+                       tmp = "Registry Editor - %s" % filename
+                       gtk_window_set_title (GTK_WINDOW (mainwin), tmp)
+                       gtk_tree_store_clear(store_keys)
+                       self.load_hive(reg_root, filename)
+                       break
+               default:
+                       break
+               }
+
+               gtk_widget_destroy(openfilewin)
+
+       def on_open_local_activate(self, menuitem):
+               registry = samba.registry.open_local()
+               if (!W_ERROR_IS_OK(error)) {
+                       gtk_show_werror(mainwin, "Error while opening local registry", error)
+                       return
+               }
+               registry_load_root()
+
+static void on_open_remote_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+       char *tmp
+       GtkWidget *rpcwin = GTK_WIDGET(gtk_rpc_binding_dialog_new(NULL))
+       gint result = gtk_dialog_run(GTK_DIALOG(rpcwin))
+       WERROR error
+       struct cli_credentials *creds
+       
+       if (result != GTK_RESPONSE_ACCEPT) {
+               gtk_widget_destroy(rpcwin)
+               return
+       }
+
+       creds = cli_credentials_init()
+       cli_credentials_guess(creds, lp_ctx)
+       cli_credentials_set_gtk_callbacks(creds)
+
+       error = reg_open_remote(&registry, 
+                               NULL,
+                               creds,
+                               lp_ctx, 
+                               gtk_rpc_binding_dialog_get_binding_string(GTK_RPC_BINDING_DIALOG(rpcwin)),
+                               NULL)
+
+       if (!W_ERROR_IS_OK(error)) {
+               gtk_show_werror(mainwin, "Error while opening remote registry", error)
+               gtk_widget_destroy(rpcwin)
+               return
+       }
+
+       tmp = "Registry Editor - Remote Registry at %s" % gtk_rpc_binding_dialog_get_host(GTK_RPC_BINDING_DIALOG(rpcwin))
+       gtk_window_set_title (GTK_WINDOW (mainwin), tmp)
+
+       self.load_root()
+
+
+       gtk_widget_destroy(rpcwin)
+}
+
+
+       def on_save_as_activate(self, menuitem):
+               error = WERR_OK
+               savefilewin = create_savefilewin(NULL)
+               result = gtk_dialog_run(GTK_DIALOG(savefilewin))
+               switch(result) {
+               case GTK_RESPONSE_ACCEPT:
+               /* FIXME:               error = reg_dump(registry, gtk_file_selection_get_filename(GTK_FILE_SELECTION(savefilewin))); */
+                       if (!W_ERROR_IS_OK(error)) {
+                               gtk_show_werror(mainwin, "Error while saving as", error)
+                       }
+                       break
+
+               default:
+                       break
+
+               }
+               gtk_widget_destroy(savefilewin)
+       }
+
+
+       def on_quit_activate(self, menuitem):
+               gtk_main_quit()
+
+
+       def on_delete_value_activate(self, menuitem):
+               if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_vals)), NULL, &iter)) {
+                       return
+               }
+
+               gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 0, &value, -1)
+               
+               error = reg_del_value(current_key, value)
+
+               if (!W_ERROR_IS_OK(error)) {
+                       gtk_show_werror(NULL, "Error while deleting value", error)
+                       return
+
+       def on_delete_key_activate(self, menuitem):
+               WERROR error
+               GtkTreeIter iter, parentiter
+               struct registry_key *parent_key
+
+               if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys)), NULL, &iter)) {
+                       return
+               }
+
+               if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_keys), &parentiter, &iter)) {
+                       return
+               }
+               
+               gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &parentiter, 1, 
+                                                  &parent_key, -1)
+               
+               /* FIXME 
+               error = reg_key_del(parent_key, current_key->name); */
+
+               if (!W_ERROR_IS_OK(error)) {
+                       gtk_show_werror(NULL, "Error while deleting key", error)
+                       return
+
+       def on_add_key_activate(self, menuitem, user_data):
+               addwin = GTK_DIALOG(create_NewKeyDialog(&entry))
+               result = gtk_dialog_run(addwin)
+
+               if (result == GTK_RESPONSE_OK)
+               {
+                       struct registry_key *newkey
+                       WERROR error = reg_key_add_name(current_key, gtk_entry_get_text(GTK_ENTRY(entry)), 0, NULL, &newkey)
+
+                       if (!W_ERROR_IS_OK(error)) {
+                               gtk_show_werror(NULL, "Error while adding key", error)
+                       }
+               }
+
+               gtk_widget_destroy(GTK_WIDGET(addwin))
+
+       def on_value_activate(self, treeview, arg1, arg2):
+               addwin = SetValueDialog(&entry_name, &entry_type, &entry_value)
+
+               gtk_tree_model_get_iter(GTK_TREE_MODEL(store_vals), &iter, arg1)
+
+               gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 0, &valname, -1)
+               gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 2, &valdesc, -1)
+               gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 3, &valtype, -1)
+
+               gtk_widget_set_sensitive(entry_name, False)
+               gtk_entry_set_text(GTK_ENTRY(entry_name), valname)
+               gtk_entry_set_text(GTK_ENTRY(entry_value), valdesc)
+               gtk_combo_box_set_active(GTK_COMBO_BOX(entry_type), valtype)
+               
+               result = gtk_dialog_run(addwin)
+               if (result == GTK_RESPONSE_OK) 
+               {
+                       WERROR error
+                       DATA_BLOB data
+                       uint32_t data_type
+                       
+                       reg_string_to_val(iconv_convenience, str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type))), gtk_entry_get_text(GTK_ENTRY(entry_value)), &data_type, &data)
+                       
+                       error = reg_val_set(current_key, gtk_entry_get_text(GTK_ENTRY(entry_name)), data_type, data)
+
+                       if (!W_ERROR_IS_OK(error)) {
+                               gtk_show_werror(NULL, "Error while setting value", error)
+                       }
+               }
+               gtk_widget_destroy(GTK_WIDGET(addwin))
+
+       def on_set_value_activate(self, menuitem, user_data):
+               addwin = GTK_DIALOG(create_SetValueDialog(&entry_name, &entry_type, &entry_value))
+               gint result = gtk_dialog_run(addwin)
+               if result == GTK_RESPONSE_OK:
+                       reg_string_to_val(iconv_convenience, str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type))), gtk_entry_get_text(GTK_ENTRY(entry_value)), &data_type, &data)
+                       
+                       error = reg_val_set(current_key, gtk_entry_get_text(GTK_ENTRY(entry_name)), data_type, data)
+
+                       if (!W_ERROR_IS_OK(error)) {
+                               gtk_show_werror(NULL, "Error while setting value", error)
+                       }
+               }
+               gtk_widget_destroy(GTK_WIDGET(addwin))
+
+       def on_find_activate(self, menuitem, user_data):
+               findwin = FindDialog()
+               # /*gint result = gtk_dialog_run(findwin)
+               # FIXME */
+               # gtk_widget_destroy(GTK_WIDGET(findwin))
+
+       def on_about_activate(self, menuitem):
+               aboutwin = samba.gtk.AboutDialog("gregedit")
+               aboutwin.run()
+               gtk_widget_destroy(GTK_WIDGET(aboutwin))
+
+       def on_key_activate(self, selection, model, path, path_currently_selected, data):
+               mnu_add_key.set_sensitive(!path_currently_selected)
+               mnu_set_value.set_sensitive(!path_currently_selected)
+               mnu_del_key.set_sensitive(!path_currently_selected)
+               mnu_del_value.set_sensitive(!path_currently_selected)
+               mnu_find.set_sensitive(!path_currently_selected)
+
+               if path_currently_selected:
+                       current_key = None
+                       return True
+
+               parent = store_keys.get_iter(path)
+               k = store_keys.get(parent, 1, -1)
+
+               current_key = k
+
+               if k is None:
+                       return False
+
+               store_vals.clear()
+
+               for(i = 0; W_ERROR_IS_OK(error = reg_key_get_value_by_index(k, i, &valname, &valtype, &valdata)); i++) {
+                       GtkTreeIter iter
+                       gtk_list_store_append(store_vals, &iter)
+                       gtk_list_store_set (store_vals, &iter, 
+                                       0, valname,
+                                       1, str_regtype(valtype),
+                                       2, reg_val_data_string(iconv_convenience, valtype, valdata),
+                                       3, valtype,
+                                       -1)
+               }
+
+               if (!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) {
+                        gtk_show_werror(mainwin, "Error while enumerating values",  error)
+                        return False
+               }
+               return True
+
+def create_mainwindow():
+       accel_group = gtk.AccelGroup()
+
+       mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL)
+       gtk_window_set_title (GTK_WINDOW (mainwin), "Registry editor")
+       gtk_window_set_default_size (GTK_WINDOW (mainwin), 642, 562)
+
+       vbox1 = gtk_vbox_new (False, 0)
+       gtk_container_add (GTK_CONTAINER (mainwin), vbox1)
+
+       menubar = gtk_menu_bar_new ()
+       gtk_box_pack_start (GTK_BOX (vbox1), menubar, False, False, 0)
+
+       menu_file = gtk_menu_item_new_with_mnemonic ("_File")
+       gtk_container_add (GTK_CONTAINER (menubar), menu_file)
+
+       menu_file_menu = gtk_menu_new ()
+       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_file), menu_file_menu)
+
+       open_local = gtk_menu_item_new_with_mnemonic ("Open _Local")
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), open_local)
+       g_signal_connect ((gpointer) open_local, "activate",
+                                                 G_CALLBACK (on_open_local_activate), NULL)
+
+       open_remote = gtk_menu_item_new_with_mnemonic ("Open _Remote")
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), open_remote)
+
+       g_signal_connect ((gpointer) open_remote, "activate",
+                                         G_CALLBACK (on_open_remote_activate),
+                                         NULL)
+
+       separatormenuitem1 = gtk_menu_item_new ()
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1)
+       gtk_widget_set_sensitive (separatormenuitem1, False)
+
+       open_file = gtk_image_menu_item_new_with_mnemonic("Open _Hive File")
+       menu_file_menu.add(open_file)
+
+       g_signal_connect(open_file, "activate",
+                        G_CALLBACK (on_open_file_activate),
+                        NULL)
+
+       separatormenuitem1 = gtk_menu_item_new ()
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1)
+       gtk_widget_set_sensitive (separatormenuitem1, False)
+
+       save = gtk_image_menu_item_new_from_stock ("gtk-save", accel_group)
+       gtk_widget_set_sensitive( save, False )
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), save)
+
+       save_as = gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group)
+       gtk_widget_set_sensitive( save_as, False )
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), save_as)
+
+       separatormenuitem1 = gtk_menu_item_new ()
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1)
+       gtk_widget_set_sensitive (separatormenuitem1, False)
+
+       quit = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group)
+       gtk_container_add (GTK_CONTAINER (menu_file_menu), quit)
+
+       men_key = gtk_menu_item_new_with_mnemonic ("_Key")
+       gtk_container_add (GTK_CONTAINER (menubar), men_key)
+
+       men_key_menu = gtk_menu_new ()
+       gtk_menu_item_set_submenu (GTK_MENU_ITEM (men_key), men_key_menu)
+
+       mnu_add_key = gtk_image_menu_item_new_with_mnemonic("Add _Subkey")
+       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_add_key), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU))
+
+       gtk_widget_set_sensitive(mnu_add_key, False)
+       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_add_key)
+
+       mnu_set_value = gtk_image_menu_item_new_with_mnemonic("Set _Value")
+       gtk_widget_set_sensitive(mnu_set_value, False)
+       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_set_value), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU))
+       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_set_value)
+
+       mnu_find = gtk_image_menu_item_new_from_stock ("gtk-find", accel_group)
+       gtk_widget_set_sensitive(mnu_find, False)
+       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_find)
+
+       mnu_del_key = gtk_image_menu_item_new_with_mnemonic ("Delete Key"); 
+       gtk_widget_set_sensitive(mnu_del_key, False)
+       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU))
+       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_del_key)
+
+       mnu_del_value = gtk_image_menu_item_new_with_mnemonic ("Delete Value"); 
+       gtk_widget_set_sensitive(mnu_del_value, False)
+       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU))
+       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_del_value)
+
+
+       help = gtk_menu_item_new_with_mnemonic ("_Help")
+       gtk_container_add (GTK_CONTAINER (menubar), help)
+
+       help_menu = gtk_menu_new ()
+       gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu)
+
+       about = gtk_menu_item_new_with_mnemonic ("_About")
+       gtk_container_add (GTK_CONTAINER (help_menu), about)
+
+       hbox1 = gtk_hbox_new (False, 0)
+       gtk_box_pack_start (GTK_BOX (vbox1), hbox1, True, True, 0)
+
+       scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL)
+       gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow1, True, True, 0)
+
+       tree_keys = gtk_tree_view_new ()
+
+       # Column names
+       curcol = gtk_tree_view_column_new ()
+       gtk_tree_view_column_set_title(curcol, "Name")
+       renderer = gtk_cell_renderer_text_new()
+       gtk_tree_view_column_pack_start(curcol, renderer, True)
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_keys), curcol)
+
+       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0)
+       gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree_keys)
+       store_keys = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER)
+       gtk_tree_view_set_model(GTK_TREE_VIEW(tree_keys), GTK_TREE_MODEL(store_keys))
+
+       gtk_tree_selection_set_select_function (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys)), on_key_activate, NULL, NULL)
+
+       g_signal_connect ((gpointer) tree_keys, "row-expanded",
+                                         G_CALLBACK (expand_key),
+                                         NULL)
+
+
+       scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL)
+       gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow2, True, True, 0)
+
+       tree_vals = gtk_tree_view_new ()
+       # Column names
+
+       curcol = gtk_tree_view_column_new ()
+       gtk_tree_view_column_set_title(curcol, "Name")
+       renderer = gtk_cell_renderer_text_new()
+       gtk_tree_view_column_pack_start(curcol, renderer, True)
+       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol)
+       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0)
+
+       curcol = gtk_tree_view_column_new ()
+       gtk_tree_view_column_set_title(curcol, "Type")
+       renderer = gtk_cell_renderer_text_new()
+       gtk_tree_view_column_pack_start(curcol, renderer, True)
+       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol)
+       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 1)
+
+       curcol = gtk_tree_view_column_new ()
+       gtk_tree_view_column_set_title(curcol, "Value")
+       renderer = gtk_cell_renderer_text_new()
+       gtk_tree_view_column_pack_start(curcol, renderer, True)
+       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol)
+       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 2)
+
+       scrolledwindow2.add(tree_vals)
+
+       store_vals = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT)
+       tree_vals.set_model(store_vals)
+
+       statusbar = gtk_statusbar_new ()
+       gtk_box_pack_start (GTK_BOX (vbox1), statusbar, False, False, 0)
+       gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar), False)
+
+       save_as.connect("activate", self.on_save_as_activate)
+       quit.connect("activate", self.on_quit_activate)
+       mnu_add_key.connect("activate", self.on_add_key_activate)
+       mnu_set_value.connect("activate", self.on_set_value_activate)
+       mnu_find.connect("activate", self.on_find_activate)
+       mnu_del_key.connect("activate", self.on_delete_key_activate)
+       mnu_del_value.connect("activate", self.on_delete_value_activate)
+       about.connect("activate", self.on_about_activate)
+       tree_vals.connect("row-activated", self.on_value_activate)
+
+       self.add_accel_group(accel_group)
+
+       return mainwin
+
+def create_openfilewin (parent):
+       openfilewin = gtk_file_chooser_dialog_new ("Select File", parent, GTK_FILE_CHOOSER_ACTION_OPEN,
+                                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                                  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                                  NULL)
+       openfilewin.set_border_width(10)
+
+       return openfilewin
+
+
+def create_savefilewin (parent):
+       savefilewin = gtk_file_selection_new ("Select File", parent, GTK_FILE_CHOOSER_ACTION_SAVE,
+                                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                                  GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                                                  NULL)
+
+       savefilewin.set_border_width(10)
+
+       return savefilewin
+
+       def load_defaults(self):
+               registry = samba.registry.open_local()
+               self.load_root()
+
+lp_ctx = loadparm_init()
+lp_load_default(lp_ctx)
+
+mainwin = RegistryEditor()
+mainwin.show_all()
+mainwin.load_defaults()
+
+gtk.main_loop()
diff --git a/tools/gregedit.c b/tools/gregedit.c
deleted file mode 100644 (file)
index eaafa4c..0000000
+++ /dev/null
@@ -1,944 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   GTK+ registry frontend
-   
-   Copyright (C) Jelmer Vernooij 2004-2005
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-   
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-   
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#define _GNU_SOURCE
-#include <stdbool.h>
-#include <registry.h>
-#include <core/doserr.h>
-#include "common/gtk-smb.h"
-#include <events.h>
-#include <param.h>
-#include <credentials.h>
-#include <gtk/gtk.h>
-#include <gtk/gtkfilesel.h>
-
-static GtkTreeStore *store_keys;
-static GtkListStore *store_vals;
-static GtkWidget *tree_keys;
-static GtkWidget *tree_vals;
-static GtkWidget *mainwin;
-static GtkWidget *mnu_add_key, *mnu_set_value, *mnu_del_key, *mnu_del_value, *mnu_find;
-static TALLOC_CTX *mem_ctx; /* FIXME: Split up */
-
-static GtkWidget *save;
-static GtkWidget *save_as;
-static GtkWidget* create_openfilewin (GtkWindow *parent);
-static GtkWidget* create_savefilewin (GtkWindow *parent);
-struct registry_context *registry = NULL;
-struct registry_key *current_key = NULL;
-struct loadparm_context *lp_ctx;
-struct smb_iconv_convenience *iconv_convenience = NULL;
-
-static GtkWidget* create_FindDialog (void)
-{
-  GtkWidget *FindDialog;
-  GtkWidget *dialog_vbox2;
-  GtkWidget *vbox1;
-  GtkWidget *hbox1;
-  GtkWidget *label6;
-  GtkWidget *entry_pattern;
-  GtkWidget *frame3;
-  GtkWidget *alignment3;
-  GtkWidget *vbox2;
-  GtkWidget *checkbutton1;
-  GtkWidget *checkbutton2;
-  GtkWidget *checkbutton3;
-  GtkWidget *label7;
-  GtkWidget *dialog_action_area2;
-  GtkWidget *cancelbutton2;
-  GtkWidget *okbutton2;
-
-  FindDialog = gtk_dialog_new ();
-  gtk_window_set_title (GTK_WINDOW (FindDialog), "Find Key or Value");
-  gtk_window_set_resizable (GTK_WINDOW (FindDialog), FALSE);
-  gtk_window_set_type_hint (GTK_WINDOW (FindDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
-
-  dialog_vbox2 = GTK_DIALOG (FindDialog)->vbox;
-
-  vbox1 = gtk_vbox_new (FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (dialog_vbox2), vbox1, TRUE, TRUE, 0);
-
-  hbox1 = gtk_hbox_new (FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
-
-  label6 = gtk_label_new ("Find String");
-  gtk_box_pack_start (GTK_BOX (hbox1), label6, FALSE, FALSE, 0);
-
-  entry_pattern = gtk_entry_new ();
-  gtk_box_pack_start (GTK_BOX (hbox1), entry_pattern, TRUE, TRUE, 0);
-
-  frame3 = gtk_frame_new (NULL);
-  gtk_box_pack_start (GTK_BOX (vbox1), frame3, TRUE, TRUE, 0);
-  gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_NONE);
-
-  alignment3 = gtk_alignment_new (0.5, 0.5, 1, 1);
-  gtk_container_add (GTK_CONTAINER (frame3), alignment3);
-  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment3), 0, 0, 12, 0);
-
-  vbox2 = gtk_vbox_new (FALSE, 0);
-  gtk_container_add (GTK_CONTAINER (alignment3), vbox2);
-
-  checkbutton1 = gtk_check_button_new_with_mnemonic ("_Key Names");
-  gtk_box_pack_start (GTK_BOX (vbox2), checkbutton1, FALSE, FALSE, 0);
-
-  checkbutton2 = gtk_check_button_new_with_mnemonic ("_Value Names");
-  gtk_box_pack_start (GTK_BOX (vbox2), checkbutton2, FALSE, FALSE, 0);
-
-  checkbutton3 = gtk_check_button_new_with_mnemonic ("Value _Data");
-  gtk_box_pack_start (GTK_BOX (vbox2), checkbutton3, FALSE, FALSE, 0);
-
-  label7 = gtk_label_new ("<b>Search in</b>");
-  gtk_frame_set_label_widget (GTK_FRAME (frame3), label7);
-  gtk_label_set_use_markup (GTK_LABEL (label7), TRUE);
-
-  dialog_action_area2 = GTK_DIALOG (FindDialog)->action_area;
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
-
-  cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel");
-  gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog), cancelbutton2, GTK_RESPONSE_CANCEL);
-  GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT);
-
-  okbutton2 = gtk_button_new_from_stock ("gtk-ok");
-  gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog), okbutton2, GTK_RESPONSE_OK);
-  GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT);
-
-  gtk_widget_show_all (dialog_vbox2);
-
-  return FindDialog;
-}
-
-static GtkWidget* create_SetValueDialog (GtkWidget **entry_name, GtkWidget **entry_type, GtkWidget **entry_data)
-{
-  GtkWidget *SetValueDialog;
-  GtkWidget *dialog_vbox1;
-  GtkWidget *table1;
-  GtkWidget *label3;
-  GtkWidget *label4;
-  GtkWidget *label5;
-  GtkWidget *entry_value_name;
-  GtkWidget *value_data;
-  GtkWidget *combo_data_type;
-  GtkWidget *dialog_action_area1;
-  GtkWidget *cancelbutton1;
-  GtkWidget *okbutton1;
-
-  SetValueDialog = gtk_dialog_new ();
-  gtk_window_set_title (GTK_WINDOW (SetValueDialog), "Set Registry Value");
-  gtk_window_set_position (GTK_WINDOW (SetValueDialog), GTK_WIN_POS_CENTER);
-  gtk_window_set_resizable (GTK_WINDOW (SetValueDialog), FALSE);
-  gtk_window_set_type_hint (GTK_WINDOW (SetValueDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
-
-  dialog_vbox1 = GTK_DIALOG (SetValueDialog)->vbox;
-
-  table1 = gtk_table_new (3, 2, FALSE);
-  gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, TRUE, TRUE, 0);
-
-  label3 = gtk_label_new ("Value name:");
-  gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 0, 1,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
-
-  label4 = gtk_label_new ("Data Type:");
-  gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 1, 2,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
-
-  label5 = gtk_label_new ("Data:");
-  gtk_table_attach (GTK_TABLE (table1), label5, 0, 1, 2, 3,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
-
-  *entry_name = entry_value_name = gtk_entry_new ();
-  gtk_table_attach (GTK_TABLE (table1), entry_value_name, 1, 2, 0, 1,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-
-  *entry_data = value_data = gtk_entry_new ();
-  gtk_table_attach (GTK_TABLE (table1), value_data, 1, 2, 2, 3,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-
-  *entry_type = combo_data_type = gtk_combo_box_new_text ();
-
-  gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_NONE");
-  gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_SZ");
-  gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_EXPAND_SZ");
-  gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_BINARY");
-  gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_DWORD_LE");
-  gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_DWORD_BE");
-  
-  gtk_table_attach (GTK_TABLE (table1), combo_data_type, 1, 2, 1, 2,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);
-
-  dialog_action_area1 = GTK_DIALOG (SetValueDialog)->action_area;
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
-
-  cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
-  gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog), cancelbutton1, GTK_RESPONSE_CANCEL);
-  GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
-
-  okbutton1 = gtk_button_new_from_stock ("gtk-ok");
-  gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog), okbutton1, GTK_RESPONSE_OK);
-  GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
-
-  gtk_widget_show_all (dialog_vbox1);
-
-  return SetValueDialog;
-}
-
-static GtkWidget* create_NewKeyDialog (GtkWidget **name_entry)
-{
-  GtkWidget *NewKeyDialog;
-  GtkWidget *dialog_vbox2;
-  GtkWidget *hbox1;
-  GtkWidget *label6;
-  GtkWidget *entry_key_name;
-  GtkWidget *dialog_action_area2;
-  GtkWidget *cancelbutton2;
-  GtkWidget *okbutton2;
-
-  NewKeyDialog = gtk_dialog_new ();
-  gtk_window_set_title (GTK_WINDOW (NewKeyDialog), "New Registry Key");
-  gtk_window_set_position (GTK_WINDOW (NewKeyDialog), GTK_WIN_POS_CENTER);
-  gtk_window_set_resizable (GTK_WINDOW (NewKeyDialog), FALSE);
-  gtk_window_set_type_hint (GTK_WINDOW (NewKeyDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
-
-  dialog_vbox2 = GTK_DIALOG (NewKeyDialog)->vbox;
-
-  hbox1 = gtk_hbox_new (FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (dialog_vbox2), hbox1, TRUE, TRUE, 0);
-
-  label6 = gtk_label_new ("Name:");
-  gtk_box_pack_start (GTK_BOX (hbox1), label6, FALSE, FALSE, 0);
-
-  entry_key_name = gtk_entry_new ();
-  gtk_box_pack_start (GTK_BOX (hbox1), entry_key_name, TRUE, TRUE, 0);
-
-  dialog_action_area2 = GTK_DIALOG (NewKeyDialog)->action_area;
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
-
-  *name_entry = entry_key_name;
-
-  cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel");
-  gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog), cancelbutton2, GTK_RESPONSE_CANCEL);
-  GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT);
-
-  okbutton2 = gtk_button_new_from_stock ("gtk-ok");
-  gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog), okbutton2, GTK_RESPONSE_OK);
-  GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT);
-
-  gtk_widget_show_all (dialog_vbox2);
-
-  return NewKeyDialog;
-}
-
-static void expand_key(GtkTreeView *treeview, GtkTreeIter *parent, GtkTreePath *arg2)
-{
-       GtkTreeIter firstiter, iter, tmpiter;
-       struct registry_key *k, *sub;
-       const char *subname;
-       char *name;
-       WERROR error;
-       int i;
-
-       gtk_tree_model_iter_children(GTK_TREE_MODEL(store_keys), &firstiter, parent);
-
-       /* See if this row has ever had a name gtk_tree_store_set()'ed to it.
-                  If not, read the directory contents */
-       gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &firstiter, 0, &name, -1);
-
-       if (name != NULL)
-               return;
-
-       gtk_tree_model_get(GTK_TREE_MODEL(store_keys), parent, 1, &k, -1);
-
-       g_assert(k);
-       
-       for(i = 0; W_ERROR_IS_OK(error = reg_key_get_subkey_by_index(mem_ctx, k, i, &subname, NULL, NULL)); i++) {
-               uint32_t count;
-
-               error = reg_open_key(mem_ctx, k, subname, &sub);
-
-               if (!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) { 
-                       gtk_show_werror(mainwin, "While enumerating subkeys", error);
-                       return;
-               }
-
-               /* Replace the blank child with the first directory entry
-           You may be tempted to remove the blank child node and then 
-           append a new one.  Don't.  If you remove the blank child 
-           node GTK gets confused and won't expand the parent row. */
-
-               if(i == 0) {
-                       iter = firstiter;
-               } else {
-                       gtk_tree_store_append(store_keys, &iter, parent);
-               }
-               gtk_tree_store_set(store_keys, &iter, 
-                                               0, subname,
-                                               1, sub,
-                                               -1);
-               
-               if (W_ERROR_IS_OK(reg_key_get_info(mem_ctx, sub, NULL, &count, NULL, NULL, NULL, NULL, NULL)) && count > 0) 
-                       gtk_tree_store_append(store_keys, &tmpiter, &iter);
-       }
-
-       if (!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) { 
-               gtk_show_werror(mainwin, "While enumerating subkeys", error);
-       }
-}
-
-static void registry_load_hive(struct registry_key *root, const char *name)
-{
-       GtkTreeIter iter, tmpiter;
-       gtk_list_store_clear(store_vals);
-       /* Add the root */
-       gtk_tree_store_append(store_keys, &iter, NULL);
-       gtk_tree_store_set (store_keys, &iter, 
-                                       0, name != NULL?name:"",
-                                       1, root,
-                                       -1);
-
-       gtk_tree_store_append(store_keys, &tmpiter, &iter);
-
-       gtk_widget_set_sensitive( save, TRUE );
-       gtk_widget_set_sensitive( save_as, TRUE );
-}
-
-static void registry_load_root(void) 
-{
-       struct registry_key *root;
-       uint32_t i = 0;
-       if (!registry) return;
-
-       gtk_list_store_clear(store_vals);
-       gtk_tree_store_clear(store_keys);
-
-       for(i = HKEY_CLASSES_ROOT; i <= HKEY_PERFORMANCE_NLSTEXT; i++) 
-       {
-               if (!W_ERROR_IS_OK(reg_get_predefined_key(registry, i, &root))) { continue; }
-
-               registry_load_hive(root, reg_get_predef_name(i));
-       }
-}
-
-static void on_open_file_activate (GtkMenuItem *menuitem, gpointer user_data)
-{
-       GtkWidget *openfilewin;
-       gint result;
-       char *filename, *tmp;
-       struct hive_key *hive_root;
-       struct registry_key *reg_root;
-       WERROR error;
-
-       openfilewin = create_openfilewin(NULL);
-
-       result = gtk_dialog_run(GTK_DIALOG(openfilewin));
-
-       switch(result) {
-       case GTK_RESPONSE_ACCEPT:
-               filename = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(openfilewin)));
-               error = reg_open_hive(NULL, filename, NULL, NULL, gtk_event_context(), lp_ctx, &hive_root);
-               if (!W_ERROR_IS_OK(error)) {
-                       gtk_show_werror(mainwin, "Error while opening hive", error);
-                       break;
-               }
-
-               reg_root = reg_import_hive_key(registry, hive_root, -1, NULL);
-
-               tmp = g_strdup_printf("Registry Editor - %s", filename);
-               gtk_window_set_title (GTK_WINDOW (mainwin), tmp);
-               g_free(tmp);
-               gtk_tree_store_clear(store_keys);
-               registry_load_hive(reg_root, filename);
-               break;
-       default:
-               break;
-       }
-
-       gtk_widget_destroy(openfilewin);
-}
-
-static void on_open_local_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       WERROR error = reg_open_local(NULL, &registry);
-       if (!W_ERROR_IS_OK(error)) {
-               gtk_show_werror(mainwin, "Error while opening local registry", error);
-               return;
-       }
-       registry_load_root();
-}
-
-static void on_open_remote_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       char *tmp;
-       GtkWidget *rpcwin = GTK_WIDGET(gtk_rpc_binding_dialog_new(NULL));
-       gint result = gtk_dialog_run(GTK_DIALOG(rpcwin));
-       WERROR error;
-       struct cli_credentials *creds;
-       
-       if (result != GTK_RESPONSE_ACCEPT) {
-               gtk_widget_destroy(rpcwin);
-               return;
-       }
-
-       creds = cli_credentials_init(mem_ctx);
-       cli_credentials_guess(creds, lp_ctx);
-       cli_credentials_set_gtk_callbacks(creds);
-
-       error = reg_open_remote(&registry, 
-                               NULL,
-                               creds,
-                               lp_ctx, 
-                               gtk_rpc_binding_dialog_get_binding_string(GTK_RPC_BINDING_DIALOG(rpcwin), mem_ctx),
-                               NULL);
-
-       if (!W_ERROR_IS_OK(error)) {
-               gtk_show_werror(mainwin, "Error while opening remote registry", error);
-               gtk_widget_destroy(rpcwin);
-               return;
-       }
-
-       tmp = g_strdup_printf("Registry Editor - Remote Registry at %s", gtk_rpc_binding_dialog_get_host(GTK_RPC_BINDING_DIALOG(rpcwin)));
-       gtk_window_set_title (GTK_WINDOW (mainwin), tmp);
-       g_free(tmp);
-
-       registry_load_root();
-
-
-       gtk_widget_destroy(rpcwin);
-}
-
-
-static void on_save_as_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       gint result;
-       WERROR error = WERR_OK;
-       GtkWidget *savefilewin = create_savefilewin(NULL);
-       result = gtk_dialog_run(GTK_DIALOG(savefilewin));
-       switch(result) {
-       case GTK_RESPONSE_ACCEPT:
-       /* FIXME:               error = reg_dump(registry, gtk_file_selection_get_filename(GTK_FILE_SELECTION(savefilewin))); */
-               if (!W_ERROR_IS_OK(error)) {
-                       gtk_show_werror(mainwin, "Error while saving as", error);
-               }
-               break;
-
-       default:
-               break;
-
-       }
-       gtk_widget_destroy(savefilewin);
-}
-
-
-static void on_quit_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       gtk_main_quit();
-}
-
-
-static void on_delete_value_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       WERROR error;
-       GtkTreeIter iter;
-       const char *value;
-
-       if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_vals)), NULL, &iter)) {
-               return;
-       }
-
-       gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 0, &value, -1);
-       
-       error = reg_del_value(current_key, value);
-
-       if (!W_ERROR_IS_OK(error)) {
-               gtk_show_werror(NULL, "Error while deleting value", error);
-               return;
-       }
-}
-
-static void on_delete_key_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       WERROR error;
-       GtkTreeIter iter, parentiter;
-       struct registry_key *parent_key;
-
-       if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys)), NULL, &iter)) {
-               return;
-       }
-
-       if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_keys), &parentiter, &iter)) {
-               return;
-       }
-       
-       gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &parentiter, 1, 
-                                          &parent_key, -1);
-       
-       /* FIXME 
-       error = reg_key_del(parent_key, current_key->name); */
-
-       if (!W_ERROR_IS_OK(error)) {
-               gtk_show_werror(NULL, "Error while deleting key", error);
-               return;
-       }
-}
-
-static void on_add_key_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       GtkWidget *entry;
-       GtkDialog *addwin = GTK_DIALOG(create_NewKeyDialog(&entry));
-       gint result = gtk_dialog_run(addwin);
-
-       if (result == GTK_RESPONSE_OK)
-       {
-               struct registry_key *newkey;
-               WERROR error = reg_key_add_name(mem_ctx, current_key, gtk_entry_get_text(GTK_ENTRY(entry)), 0, NULL, &newkey);
-
-               if (!W_ERROR_IS_OK(error)) {
-                       gtk_show_werror(NULL, "Error while adding key", error);
-               }
-       }
-
-       gtk_widget_destroy(GTK_WIDGET(addwin));
-}
-
-static void on_value_activate(GtkTreeView *treeview, GtkTreePath *arg1,
-         GtkTreeViewColumn *arg2, gpointer user_data)
-{
-       GtkWidget *entry_name, *entry_type, *entry_value;
-       GtkDialog *addwin = GTK_DIALOG(create_SetValueDialog(&entry_name, &entry_type, &entry_value));
-       GtkTreeIter iter;
-       uint32_t valtype;
-       const char *valdesc, *valname;
-       gint result;
-
-       gtk_tree_model_get_iter(GTK_TREE_MODEL(store_vals), &iter, arg1);
-
-       gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 0, &valname, -1);
-       gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 2, &valdesc, -1);
-       gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 3, &valtype, -1);
-
-       gtk_widget_set_sensitive(entry_name, FALSE);
-       gtk_entry_set_text(GTK_ENTRY(entry_name), valname);
-       gtk_entry_set_text(GTK_ENTRY(entry_value), valdesc);
-       gtk_combo_box_set_active(GTK_COMBO_BOX(entry_type), valtype);
-       
-       result = gtk_dialog_run(addwin);
-       if (result == GTK_RESPONSE_OK) 
-       {
-               WERROR error;
-               DATA_BLOB data;
-               uint32_t data_type;
-               
-               reg_string_to_val(mem_ctx, iconv_convenience, str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type))), gtk_entry_get_text(GTK_ENTRY(entry_value)), &data_type, &data);
-               
-               error = reg_val_set(current_key, gtk_entry_get_text(GTK_ENTRY(entry_name)), data_type, data);
-
-               if (!W_ERROR_IS_OK(error)) {
-                       gtk_show_werror(NULL, "Error while setting value", error);
-               }
-       }
-       gtk_widget_destroy(GTK_WIDGET(addwin));
-}
-
-static void on_set_value_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       GtkWidget *entry_name, *entry_type, *entry_value;
-       GtkDialog *addwin = GTK_DIALOG(create_SetValueDialog(&entry_name, &entry_type, &entry_value));
-       gint result = gtk_dialog_run(addwin);
-       if (result == GTK_RESPONSE_OK) 
-       {
-               WERROR error;
-               uint32_t data_type;
-               DATA_BLOB data;
-               
-               reg_string_to_val(mem_ctx, iconv_convenience, str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type))), gtk_entry_get_text(GTK_ENTRY(entry_value)), &data_type, &data);
-               
-               error = reg_val_set(current_key, gtk_entry_get_text(GTK_ENTRY(entry_name)), data_type, data);
-
-               if (!W_ERROR_IS_OK(error)) {
-                       gtk_show_werror(NULL, "Error while setting value", error);
-               }
-       }
-       gtk_widget_destroy(GTK_WIDGET(addwin));
-}
-
-static void on_find_activate(GtkMenuItem *menuitem, gpointer user_data)
-{
-       GtkDialog *findwin = GTK_DIALOG(create_FindDialog());
-       /*gint result = gtk_dialog_run(findwin);
-       FIXME */
-       gtk_widget_destroy(GTK_WIDGET(findwin));
-}
-
-static void on_about_activate (GtkMenuItem *menuitem, gpointer user_data)
-{
-    GtkDialog *aboutwin = GTK_DIALOG(create_gtk_samba_about_dialog("gregedit"));
-    gtk_dialog_run(aboutwin);
-    gtk_widget_destroy(GTK_WIDGET(aboutwin));
-}
-
-static gboolean on_key_activate(GtkTreeSelection *selection,
-                                             GtkTreeModel *model,
-                                             GtkTreePath *path,
-                                             gboolean path_currently_selected,
-                                             gpointer data)
-{
-       int i;
-       struct registry_key *k;
-       const char *valname;
-       uint32_t valtype;
-       DATA_BLOB valdata;
-       WERROR error;
-       GtkTreeIter parent;
-
-       gtk_widget_set_sensitive(mnu_add_key, !path_currently_selected);
-       gtk_widget_set_sensitive(mnu_set_value, !path_currently_selected);
-       gtk_widget_set_sensitive(mnu_del_key, !path_currently_selected);
-       gtk_widget_set_sensitive(mnu_del_value, !path_currently_selected);
-       gtk_widget_set_sensitive(mnu_find, !path_currently_selected);
-
-       if (path_currently_selected) { 
-               current_key = NULL; 
-               return TRUE; 
-       }
-
-       gtk_tree_model_get_iter(GTK_TREE_MODEL(store_keys), &parent, path);
-       gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &parent, 1, &k, -1);
-
-       current_key = k;
-
-       if (k == NULL) 
-               return FALSE;
-
-       gtk_list_store_clear(store_vals);
-
-       for(i = 0; W_ERROR_IS_OK(error = reg_key_get_value_by_index(mem_ctx, k, i, &valname, &valtype, &valdata)); i++) {
-               GtkTreeIter iter;
-               gtk_list_store_append(store_vals, &iter);
-               gtk_list_store_set (store_vals, &iter, 
-                               0, valname,
-                               1, str_regtype(valtype),
-                               2, reg_val_data_string(mem_ctx, iconv_convenience, valtype, valdata),
-                               3, valtype,
-                               -1);
-       }
-
-       if (!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) {
-                gtk_show_werror(mainwin, "Error while enumerating values",  error);
-                return FALSE;
-       }
-       return TRUE;
-}
-
-static GtkWidget* create_mainwindow(void)
-{
-       GtkWidget *vbox1;
-       GtkWidget *menubar;
-       GtkWidget *menu_file;
-       GtkWidget *menu_file_menu;
-       GtkWidget *open_file;
-       GtkWidget *open_remote;
-       GtkWidget *open_local;
-       GtkWidget *separatormenuitem1;
-       GtkWidget *quit;
-       GtkWidget *men_key;
-       GtkWidget *men_key_menu;
-       GtkCellRenderer *renderer;
-       GtkTreeViewColumn *curcol;
-       GtkWidget *help;
-       GtkWidget *help_menu;
-       GtkWidget *about;
-       GtkWidget *hbox1;
-       GtkWidget *scrolledwindow1;
-       GtkWidget *scrolledwindow2;
-       GtkWidget *statusbar;
-       GtkAccelGroup *accel_group;
-
-       accel_group = gtk_accel_group_new ();
-
-       mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-       gtk_window_set_title (GTK_WINDOW (mainwin), "Registry editor");
-       gtk_window_set_default_size (GTK_WINDOW (mainwin), 642, 562);
-
-       vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_container_add (GTK_CONTAINER (mainwin), vbox1);
-
-       menubar = gtk_menu_bar_new ();
-       gtk_box_pack_start (GTK_BOX (vbox1), menubar, FALSE, FALSE, 0);
-
-       menu_file = gtk_menu_item_new_with_mnemonic ("_File");
-       gtk_container_add (GTK_CONTAINER (menubar), menu_file);
-
-       menu_file_menu = gtk_menu_new ();
-       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_file), menu_file_menu);
-
-       open_local = gtk_menu_item_new_with_mnemonic ("Open _Local");
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), open_local);
-       g_signal_connect ((gpointer) open_local, "activate",
-                                                 G_CALLBACK (on_open_local_activate), NULL);
-
-       open_remote = gtk_menu_item_new_with_mnemonic ("Open _Remote");
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), open_remote);
-
-       g_signal_connect ((gpointer) open_remote, "activate",
-                                         G_CALLBACK (on_open_remote_activate),
-                                         NULL);
-
-       separatormenuitem1 = gtk_menu_item_new ();
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1);
-       gtk_widget_set_sensitive (separatormenuitem1, FALSE);
-
-       open_file = gtk_image_menu_item_new_with_mnemonic("Open _Hive File");
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), open_file);
-
-       g_signal_connect(open_file, "activate",
-                        G_CALLBACK (on_open_file_activate),
-                        NULL);
-
-       separatormenuitem1 = gtk_menu_item_new ();
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1);
-       gtk_widget_set_sensitive (separatormenuitem1, FALSE);
-
-       save = gtk_image_menu_item_new_from_stock ("gtk-save", accel_group);
-       gtk_widget_set_sensitive( save, FALSE );
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), save);
-
-       save_as = gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group);
-       gtk_widget_set_sensitive( save_as, FALSE );
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), save_as);
-
-       separatormenuitem1 = gtk_menu_item_new ();
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1);
-       gtk_widget_set_sensitive (separatormenuitem1, FALSE);
-
-       quit = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
-       gtk_container_add (GTK_CONTAINER (menu_file_menu), quit);
-
-       men_key = gtk_menu_item_new_with_mnemonic ("_Key");
-       gtk_container_add (GTK_CONTAINER (menubar), men_key);
-
-       men_key_menu = gtk_menu_new ();
-       gtk_menu_item_set_submenu (GTK_MENU_ITEM (men_key), men_key_menu);
-
-       mnu_add_key = gtk_image_menu_item_new_with_mnemonic("Add _Subkey");
-       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_add_key), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU));
-
-       gtk_widget_set_sensitive(mnu_add_key, FALSE);
-       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_add_key);
-
-       mnu_set_value = gtk_image_menu_item_new_with_mnemonic("Set _Value");
-       gtk_widget_set_sensitive(mnu_set_value, FALSE);
-       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_set_value), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU));
-       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_set_value);
-
-       mnu_find = gtk_image_menu_item_new_from_stock ("gtk-find", accel_group);
-       gtk_widget_set_sensitive(mnu_find, FALSE);
-       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_find);
-
-       mnu_del_key = gtk_image_menu_item_new_with_mnemonic ("Delete Key"); 
-       gtk_widget_set_sensitive(mnu_del_key, FALSE);
-       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU));
-       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_del_key);
-
-       mnu_del_value = gtk_image_menu_item_new_with_mnemonic ("Delete Value"); 
-       gtk_widget_set_sensitive(mnu_del_value, FALSE);
-       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU));
-       gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_del_value);
-
-
-       help = gtk_menu_item_new_with_mnemonic ("_Help");
-       gtk_container_add (GTK_CONTAINER (menubar), help);
-
-       help_menu = gtk_menu_new ();
-       gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu);
-
-       about = gtk_menu_item_new_with_mnemonic ("_About");
-       gtk_container_add (GTK_CONTAINER (help_menu), about);
-
-       hbox1 = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
-
-       scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
-       gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow1, TRUE, TRUE, 0);
-
-       tree_keys = gtk_tree_view_new ();
-
-       /* Column names */
-       curcol = gtk_tree_view_column_new ();
-       gtk_tree_view_column_set_title(curcol, "Name");
-       renderer = gtk_cell_renderer_text_new();
-       gtk_tree_view_column_pack_start(curcol, renderer, TRUE);
-
-       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_keys), curcol);
-
-       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
-       gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree_keys);
-       store_keys = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
-       gtk_tree_view_set_model(GTK_TREE_VIEW(tree_keys), GTK_TREE_MODEL(store_keys));
-       g_object_unref(store_keys);
-
-       gtk_tree_selection_set_select_function (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys)), on_key_activate, NULL, NULL);
-
-       g_signal_connect ((gpointer) tree_keys, "row-expanded",
-                                         G_CALLBACK (expand_key),
-                                         NULL);
-
-
-       scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL);
-       gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow2, TRUE, TRUE, 0);
-
-       tree_vals = gtk_tree_view_new ();
-       /* Column names */
-
-       curcol = gtk_tree_view_column_new ();
-       gtk_tree_view_column_set_title(curcol, "Name");
-       renderer = gtk_cell_renderer_text_new();
-       gtk_tree_view_column_pack_start(curcol, renderer, TRUE);
-       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol);
-       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
-
-       curcol = gtk_tree_view_column_new ();
-       gtk_tree_view_column_set_title(curcol, "Type");
-       renderer = gtk_cell_renderer_text_new();
-       gtk_tree_view_column_pack_start(curcol, renderer, TRUE);
-       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol);
-       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 1);
-
-       curcol = gtk_tree_view_column_new ();
-       gtk_tree_view_column_set_title(curcol, "Value");
-       renderer = gtk_cell_renderer_text_new();
-       gtk_tree_view_column_pack_start(curcol, renderer, TRUE);
-       gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol);
-       gtk_tree_view_column_add_attribute(curcol, renderer, "text", 2);
-
-
-       gtk_container_add (GTK_CONTAINER (scrolledwindow2), tree_vals);
-
-       store_vals = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
-       gtk_tree_view_set_model(GTK_TREE_VIEW(tree_vals), GTK_TREE_MODEL(store_vals));
-       g_object_unref(store_vals);
-
-       statusbar = gtk_statusbar_new ();
-       gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
-       gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar), FALSE);
-
-       g_signal_connect ((gpointer) save_as, "activate",
-                                         G_CALLBACK (on_save_as_activate),
-                                         NULL);
-       g_signal_connect ((gpointer) quit, "activate",
-                                         G_CALLBACK (on_quit_activate),
-                                         NULL);
-       g_signal_connect ((gpointer) mnu_add_key, "activate",
-                                         G_CALLBACK (on_add_key_activate),
-                                         NULL);
-       g_signal_connect ((gpointer) mnu_set_value, "activate",
-                                         G_CALLBACK (on_set_value_activate),
-                                         NULL);
-       g_signal_connect ((gpointer) mnu_find, "activate",
-                                         G_CALLBACK (on_find_activate),
-                                         NULL);
-       g_signal_connect ((gpointer) mnu_del_key, "activate",
-                                         G_CALLBACK (on_delete_key_activate),
-                                         NULL);
-       g_signal_connect ((gpointer) mnu_del_value, "activate",
-                                         G_CALLBACK (on_delete_value_activate),
-                                         NULL);
-       g_signal_connect ((gpointer) about, "activate",
-                                         G_CALLBACK (on_about_activate),
-                                         NULL);
-
-       g_signal_connect ((gpointer) tree_vals, "row-activated",
-                                         G_CALLBACK (on_value_activate),
-                                         NULL);
-
-
-       gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group);
-
-       return mainwin;
-}
-
-static GtkWidget* create_openfilewin (GtkWindow *parent)
-{
-       GtkWidget *openfilewin;
-
-       openfilewin = gtk_file_chooser_dialog_new ("Select File", parent, GTK_FILE_CHOOSER_ACTION_OPEN,
-                                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                                  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-                                                  NULL);
-       gtk_container_set_border_width (GTK_CONTAINER (openfilewin), 10);
-
-       return openfilewin;
-}
-
-static GtkWidget* create_savefilewin (GtkWindow *parent)
-{
-       GtkWidget *savefilewin;
-
-       savefilewin = gtk_file_selection_new ("Select File", parent, GTK_FILE_CHOOSER_ACTION_SAVE,
-                                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                                  GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
-                                                  NULL);
-
-       gtk_container_set_border_width (GTK_CONTAINER (savefilewin), 10);
-
-       return savefilewin;
-}
-
-static int gregedit_load_defaults(void)
-{
-       WERROR error = reg_open_local(NULL, &registry);
-       if(!W_ERROR_IS_OK(error)) {
-               gtk_show_werror(mainwin, "Error while loading local registry", error);
-               return -1;
-       }
-       registry_load_root();
-
-       return 0;
-}
-
-int main(int argc, char *argv[])
-{
-       int ret;
-
-       mem_ctx = talloc_init("gregedit");
-
-       lp_ctx = loadparm_init(mem_ctx);
-       lp_load_default(lp_ctx);
-
-       gtk_init(&argc, &argv);
-       mainwin = create_mainwindow();
-       gtk_widget_show_all(mainwin);
-
-       ret = gregedit_load_defaults();
-       if (ret != 0) goto failed;
-
-       ret = gtk_event_loop();
-
-failed:
-       talloc_free(mem_ctx);
-       return ret;
-}