r4959: fix compiler warning
[Samba/gebeck_regimport.git] / source4 / gtk / tools / gregedit.c
blob6ca7fb653f57a1942ccd9426b647c5660b73e0a5
1 /*
2 Unix SMB/CIFS implementation.
3 GTK+ registry frontend
5 Copyright (C) Jelmer Vernooij 2004
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "includes.h"
23 #include "dynconfig.h"
24 #include "registry.h"
25 #include "lib/cmdline/popt_common.h"
26 #include "gtk/common/select.h"
27 #include "gtk/common/gtk-smb.h"
29 GtkWidget *openfilewin;
30 GtkWidget *savefilewin;
31 GtkTreeStore *store_keys;
32 GtkListStore *store_vals;
33 GtkWidget *tree_keys;
34 GtkWidget *tree_vals;
35 GtkWidget *mainwin;
36 GtkWidget *mnu_add_key, *mnu_set_value, *mnu_del_key, *mnu_del_value, *mnu_find;
37 TALLOC_CTX *mem_ctx; /* FIXME: Split up */
39 GtkWidget *save;
40 GtkWidget *save_as;
41 static GtkWidget* create_openfilewin (void);
42 static GtkWidget* create_savefilewin (void);
43 struct registry_context *registry = NULL;
44 struct registry_key *current_key = NULL;
46 static GtkWidget* create_FindDialog (void)
48 GtkWidget *FindDialog;
49 GtkWidget *dialog_vbox2;
50 GtkWidget *vbox1;
51 GtkWidget *hbox1;
52 GtkWidget *label6;
53 GtkWidget *entry_pattern;
54 GtkWidget *frame3;
55 GtkWidget *alignment3;
56 GtkWidget *vbox2;
57 GtkWidget *checkbutton1;
58 GtkWidget *checkbutton2;
59 GtkWidget *checkbutton3;
60 GtkWidget *label7;
61 GtkWidget *dialog_action_area2;
62 GtkWidget *cancelbutton2;
63 GtkWidget *okbutton2;
65 FindDialog = gtk_dialog_new ();
66 gtk_window_set_title (GTK_WINDOW (FindDialog), "Find Key or Value");
67 gtk_window_set_resizable (GTK_WINDOW (FindDialog), FALSE);
68 gtk_window_set_type_hint (GTK_WINDOW (FindDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
70 dialog_vbox2 = GTK_DIALOG (FindDialog)->vbox;
72 vbox1 = gtk_vbox_new (FALSE, 0);
73 gtk_box_pack_start (GTK_BOX (dialog_vbox2), vbox1, TRUE, TRUE, 0);
75 hbox1 = gtk_hbox_new (FALSE, 0);
76 gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
78 label6 = gtk_label_new ("Find String");
79 gtk_box_pack_start (GTK_BOX (hbox1), label6, FALSE, FALSE, 0);
81 entry_pattern = gtk_entry_new ();
82 gtk_box_pack_start (GTK_BOX (hbox1), entry_pattern, TRUE, TRUE, 0);
84 frame3 = gtk_frame_new (NULL);
85 gtk_box_pack_start (GTK_BOX (vbox1), frame3, TRUE, TRUE, 0);
86 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_NONE);
88 alignment3 = gtk_alignment_new (0.5, 0.5, 1, 1);
89 gtk_container_add (GTK_CONTAINER (frame3), alignment3);
90 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment3), 0, 0, 12, 0);
92 vbox2 = gtk_vbox_new (FALSE, 0);
93 gtk_container_add (GTK_CONTAINER (alignment3), vbox2);
95 checkbutton1 = gtk_check_button_new_with_mnemonic ("_Key Names");
96 gtk_box_pack_start (GTK_BOX (vbox2), checkbutton1, FALSE, FALSE, 0);
98 checkbutton2 = gtk_check_button_new_with_mnemonic ("_Value Names");
99 gtk_box_pack_start (GTK_BOX (vbox2), checkbutton2, FALSE, FALSE, 0);
101 checkbutton3 = gtk_check_button_new_with_mnemonic ("Value _Data");
102 gtk_box_pack_start (GTK_BOX (vbox2), checkbutton3, FALSE, FALSE, 0);
104 label7 = gtk_label_new ("<b>Search in</b>");
105 gtk_frame_set_label_widget (GTK_FRAME (frame3), label7);
106 gtk_label_set_use_markup (GTK_LABEL (label7), TRUE);
108 dialog_action_area2 = GTK_DIALOG (FindDialog)->action_area;
109 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
111 cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel");
112 gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog), cancelbutton2, GTK_RESPONSE_CANCEL);
113 GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT);
115 okbutton2 = gtk_button_new_from_stock ("gtk-ok");
116 gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog), okbutton2, GTK_RESPONSE_OK);
117 GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT);
119 gtk_widget_show_all (dialog_vbox2);
121 return FindDialog;
124 static GtkWidget* create_SetValueDialog (GtkWidget **entry_name, GtkWidget **entry_type, GtkWidget **entry_data)
126 GtkWidget *SetValueDialog;
127 GtkWidget *dialog_vbox1;
128 GtkWidget *table1;
129 GtkWidget *label3;
130 GtkWidget *label4;
131 GtkWidget *label5;
132 GtkWidget *entry_value_name;
133 GtkWidget *value_data;
134 GtkWidget *combo_data_type;
135 GtkWidget *dialog_action_area1;
136 GtkWidget *cancelbutton1;
137 GtkWidget *okbutton1;
139 SetValueDialog = gtk_dialog_new ();
140 gtk_window_set_title (GTK_WINDOW (SetValueDialog), "Set Registry Value");
141 gtk_window_set_position (GTK_WINDOW (SetValueDialog), GTK_WIN_POS_CENTER);
142 gtk_window_set_resizable (GTK_WINDOW (SetValueDialog), FALSE);
143 gtk_window_set_type_hint (GTK_WINDOW (SetValueDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
145 dialog_vbox1 = GTK_DIALOG (SetValueDialog)->vbox;
147 table1 = gtk_table_new (3, 2, FALSE);
148 gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, TRUE, TRUE, 0);
150 label3 = gtk_label_new ("Value name:");
151 gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 0, 1,
152 (GtkAttachOptions) (GTK_FILL),
153 (GtkAttachOptions) (0), 0, 0);
154 gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
156 label4 = gtk_label_new ("Data Type:");
157 gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 1, 2,
158 (GtkAttachOptions) (GTK_FILL),
159 (GtkAttachOptions) (0), 0, 0);
160 gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
162 label5 = gtk_label_new ("Data:");
163 gtk_table_attach (GTK_TABLE (table1), label5, 0, 1, 2, 3,
164 (GtkAttachOptions) (GTK_FILL),
165 (GtkAttachOptions) (0), 0, 0);
166 gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
168 *entry_name = entry_value_name = gtk_entry_new ();
169 gtk_table_attach (GTK_TABLE (table1), entry_value_name, 1, 2, 0, 1,
170 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
171 (GtkAttachOptions) (0), 0, 0);
173 *entry_data = value_data = gtk_entry_new ();
174 gtk_table_attach (GTK_TABLE (table1), value_data, 1, 2, 2, 3,
175 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
176 (GtkAttachOptions) (0), 0, 0);
178 *entry_type = combo_data_type = gtk_combo_box_new_text ();
180 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_NONE");
181 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_SZ");
182 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_EXPAND_SZ");
183 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_BINARY");
184 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_DWORD_LE");
185 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type), "REG_DWORD_BE");
187 gtk_table_attach (GTK_TABLE (table1), combo_data_type, 1, 2, 1, 2,
188 (GtkAttachOptions) (GTK_FILL),
189 (GtkAttachOptions) (GTK_FILL), 0, 0);
191 dialog_action_area1 = GTK_DIALOG (SetValueDialog)->action_area;
192 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
194 cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
195 gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog), cancelbutton1, GTK_RESPONSE_CANCEL);
196 GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
198 okbutton1 = gtk_button_new_from_stock ("gtk-ok");
199 gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog), okbutton1, GTK_RESPONSE_OK);
200 GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
202 gtk_widget_show_all (dialog_vbox1);
204 return SetValueDialog;
207 static GtkWidget* create_NewKeyDialog (GtkWidget **name_entry)
209 GtkWidget *NewKeyDialog;
210 GtkWidget *dialog_vbox2;
211 GtkWidget *hbox1;
212 GtkWidget *label6;
213 GtkWidget *entry_key_name;
214 GtkWidget *dialog_action_area2;
215 GtkWidget *cancelbutton2;
216 GtkWidget *okbutton2;
218 NewKeyDialog = gtk_dialog_new ();
219 gtk_window_set_title (GTK_WINDOW (NewKeyDialog), "New Registry Key");
220 gtk_window_set_position (GTK_WINDOW (NewKeyDialog), GTK_WIN_POS_CENTER);
221 gtk_window_set_resizable (GTK_WINDOW (NewKeyDialog), FALSE);
222 gtk_window_set_type_hint (GTK_WINDOW (NewKeyDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
224 dialog_vbox2 = GTK_DIALOG (NewKeyDialog)->vbox;
226 hbox1 = gtk_hbox_new (FALSE, 0);
227 gtk_box_pack_start (GTK_BOX (dialog_vbox2), hbox1, TRUE, TRUE, 0);
229 label6 = gtk_label_new ("Name:");
230 gtk_box_pack_start (GTK_BOX (hbox1), label6, FALSE, FALSE, 0);
232 entry_key_name = gtk_entry_new ();
233 gtk_box_pack_start (GTK_BOX (hbox1), entry_key_name, TRUE, TRUE, 0);
235 dialog_action_area2 = GTK_DIALOG (NewKeyDialog)->action_area;
236 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
238 *name_entry = entry_key_name;
240 cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel");
241 gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog), cancelbutton2, GTK_RESPONSE_CANCEL);
242 GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT);
244 okbutton2 = gtk_button_new_from_stock ("gtk-ok");
245 gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog), okbutton2, GTK_RESPONSE_OK);
246 GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT);
248 gtk_widget_show_all (dialog_vbox2);
250 return NewKeyDialog;
254 static void expand_key(GtkTreeView *treeview, GtkTreeIter *parent, GtkTreePath *arg2)
256 GtkTreeIter firstiter, iter, tmpiter;
257 struct registry_key *k, *sub;
258 char *name;
259 WERROR error;
260 int i;
262 gtk_tree_model_iter_children(GTK_TREE_MODEL(store_keys), &firstiter, parent);
264 /* See if this row has ever had a name gtk_tree_store_set()'ed to it.
265 If not, read the directory contents */
266 gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &firstiter, 0, &name, -1);
268 if(name) return;
270 gtk_tree_model_get(GTK_TREE_MODEL(store_keys), parent, 1, &k, -1);
272 g_assert(k);
274 for(i = 0; W_ERROR_IS_OK(error = reg_key_get_subkey_by_index(mem_ctx, k, i, &sub)); i++) {
275 int count;
276 /* Replace the blank child with the first directory entry
277 You may be tempted to remove the blank child node and then
278 append a new one. Don't. If you remove the blank child
279 node GTK gets confused and won't expand the parent row. */
281 if(i == 0) {
282 iter = firstiter;
283 } else {
284 gtk_tree_store_append(store_keys, &iter, parent);
286 gtk_tree_store_set (store_keys,
287 &iter,
289 sub->name,
291 sub,
292 -1);
294 if(W_ERROR_IS_OK(reg_key_num_subkeys(sub, &count)) && count > 0)
295 gtk_tree_store_append(store_keys, &tmpiter, &iter);
298 if(!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) gtk_show_werror(mainwin, error);
301 static void registry_load_hive(struct registry_key *root)
303 GtkTreeIter iter, tmpiter;
304 gtk_list_store_clear(store_vals);
305 /* Add the root */
306 gtk_tree_store_append(store_keys, &iter, NULL);
307 gtk_tree_store_set (store_keys,
308 &iter,
310 root->name?root->name:"",
312 root,
313 -1);
315 gtk_tree_store_append(store_keys, &tmpiter, &iter);
317 gtk_widget_set_sensitive( save, True );
318 gtk_widget_set_sensitive( save_as, True );
321 static void registry_load_root(void)
323 struct registry_key *root;
324 uint32_t i = 0;
325 if(!registry) return;
327 gtk_list_store_clear(store_vals);
328 gtk_tree_store_clear(store_keys);
330 for(i = HKEY_CLASSES_ROOT; i <= HKEY_PERFORMANCE_NLSTEXT; i++)
332 if (!W_ERROR_IS_OK(reg_get_predefined_key(registry, i, &root))) { continue; }
334 registry_load_hive(root);
338 static void on_open_file_activate (GtkMenuItem *menuitem, gpointer user_data)
340 gint result = gtk_dialog_run(GTK_DIALOG(create_openfilewin()));
341 char *filename, *tmp;
342 struct registry_key *root;
343 WERROR error;
344 switch(result) {
345 case GTK_RESPONSE_OK:
346 filename = strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(openfilewin)));
347 error = reg_open_hive(NULL, user_data, filename, NULL, &root);
348 if(!W_ERROR_IS_OK(error)) {
349 gtk_show_werror(mainwin, error);
350 break;
353 tmp = g_strdup_printf("Registry Editor - %s", filename);
354 gtk_window_set_title (GTK_WINDOW (mainwin), tmp);
355 g_free(tmp);
356 gtk_tree_store_clear(store_keys);
357 registry_load_hive(root);
358 break;
359 default:
360 break;
363 gtk_widget_destroy(openfilewin);
366 static void on_open_gconf_activate (GtkMenuItem *menuitem,
367 gpointer user_data)
369 struct registry_key *root;
370 WERROR error = reg_open_hive(NULL, "gconf", NULL, NULL, &root);
371 if(!W_ERROR_IS_OK(error)) {
372 gtk_show_werror(mainwin, error);
373 return;
376 gtk_window_set_title (GTK_WINDOW (mainwin), "Registry Editor - GConf");
378 gtk_tree_store_clear(store_keys);
379 registry_load_hive(root);
382 static void on_open_local_activate(GtkMenuItem *menuitem, gpointer user_data)
384 WERROR error = reg_open_local(&registry);
385 if(!W_ERROR_IS_OK(error)) {
386 gtk_show_werror(mainwin, error);
387 return;
389 registry_load_root();
392 static void on_open_remote_activate(GtkMenuItem *menuitem, gpointer user_data)
394 char *tmp;
395 GtkWidget *rpcwin = GTK_WIDGET(gtk_rpc_binding_dialog_new(FALSE, NULL));
396 gint result = gtk_dialog_run(GTK_DIALOG(rpcwin));
397 WERROR error;
399 if(result != GTK_RESPONSE_ACCEPT)
401 gtk_widget_destroy(rpcwin);
402 return;
405 error = reg_open_remote(&registry,
406 gtk_rpc_binding_dialog_get_username(GTK_RPC_BINDING_DIALOG(rpcwin)),
407 gtk_rpc_binding_dialog_get_password(GTK_RPC_BINDING_DIALOG(rpcwin)),
408 gtk_rpc_binding_dialog_get_binding_string(GTK_RPC_BINDING_DIALOG(rpcwin), mem_ctx));
410 if(!W_ERROR_IS_OK(error)) {
411 gtk_show_werror(mainwin, error);
412 gtk_widget_destroy(rpcwin);
413 return;
416 tmp = g_strdup_printf("Registry Editor - Remote Registry at %s", gtk_rpc_binding_dialog_get_host(GTK_RPC_BINDING_DIALOG(rpcwin)));
417 gtk_window_set_title (GTK_WINDOW (mainwin), tmp);
418 g_free(tmp);
420 registry_load_root();
423 gtk_widget_destroy(rpcwin);
427 static void on_save_activate (GtkMenuItem *menuitem,
428 gpointer user_data)
430 WERROR error = reg_save(registry, NULL);
431 if(!W_ERROR_IS_OK(error)) {
432 gtk_show_werror(mainwin, error);
437 static void on_save_as_activate (GtkMenuItem *menuitem,
438 gpointer user_data)
440 gint result;
441 WERROR error;
442 create_savefilewin();
443 result = gtk_dialog_run(GTK_DIALOG(savefilewin));
444 switch(result) {
445 case GTK_RESPONSE_OK:
446 error = reg_save(registry, gtk_file_selection_get_filename(GTK_FILE_SELECTION(savefilewin)));
447 if(!W_ERROR_IS_OK(error)) {
448 gtk_show_werror(mainwin, error);
450 break;
452 default:
453 break;
456 gtk_widget_destroy(savefilewin);
460 static void on_quit_activate (GtkMenuItem *menuitem,
461 gpointer user_data)
463 gtk_main_quit();
467 static void on_delete_value_activate (GtkMenuItem *menuitem,
468 gpointer user_data)
470 WERROR error;
471 GtkTreeIter iter;
472 const char *value;
474 if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_vals)), NULL, &iter)) {
475 return;
478 gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 0, &value, -1);
480 error = reg_del_value(current_key, value);
482 if (!W_ERROR_IS_OK(error)) {
483 gtk_show_werror(NULL, error);
484 return;
488 static void on_delete_key_activate (GtkMenuItem *menuitem,
489 gpointer user_data)
491 WERROR error;
492 GtkTreeIter iter, parentiter;
493 struct registry_key *parent_key;
495 if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys)), NULL, &iter)) {
496 return;
499 if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_keys), &parentiter, &iter)) {
500 return;
503 gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &parentiter, 1, &parent_key, -1);
505 error = reg_key_del(parent_key, current_key->name);
507 if (!W_ERROR_IS_OK(error)) {
508 gtk_show_werror(NULL, error);
509 return;
513 static void on_add_key_activate (GtkMenuItem *menuitem,
514 gpointer user_data)
516 GtkWidget *entry;
517 GtkDialog *addwin = GTK_DIALOG(create_NewKeyDialog(&entry));
518 gint result = gtk_dialog_run(addwin);
520 if (result == GTK_RESPONSE_OK)
522 struct registry_key *newkey;
523 WERROR error = reg_key_add_name(mem_ctx, current_key, gtk_entry_get_text(GTK_ENTRY(entry)), 0, NULL, &newkey);
525 if (!W_ERROR_IS_OK(error)) {
526 gtk_show_werror(NULL, error);
530 gtk_widget_destroy(GTK_WIDGET(addwin));
533 static void on_value_activate(GtkTreeView *treeview, GtkTreePath *arg1,
534 GtkTreeViewColumn *arg2, gpointer user_data)
536 GtkWidget *entry_name, *entry_type, *entry_value;
537 GtkDialog *addwin = GTK_DIALOG(create_SetValueDialog(&entry_name, &entry_type, &entry_value));
538 GtkTreeIter iter;
539 struct registry_value *value;
540 gint result;
542 gtk_tree_model_get_iter(GTK_TREE_MODEL(store_vals), &iter, arg1);
544 gtk_tree_model_get(GTK_TREE_MODEL(store_vals), &iter, 3, &value, -1);
546 gtk_widget_set_sensitive(entry_name, FALSE);
547 gtk_entry_set_text(GTK_ENTRY(entry_name), value->name);
548 gtk_entry_set_text(GTK_ENTRY(entry_value), reg_val_data_string(mem_ctx, value));
549 gtk_combo_box_set_active(GTK_COMBO_BOX(entry_type), value->data_type);
551 result = gtk_dialog_run(addwin);
552 if (result == GTK_RESPONSE_OK)
554 WERROR error;
555 struct registry_value *val;
557 reg_string_to_val(mem_ctx,str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type))), gtk_entry_get_text(GTK_ENTRY(entry_value)), &val);
559 error = reg_val_set(current_key, gtk_entry_get_text(GTK_ENTRY(entry_name)), val->data_type, val->data_blk, val->data_len);
561 if (!W_ERROR_IS_OK(error)) {
562 gtk_show_werror(NULL, error);
565 gtk_widget_destroy(GTK_WIDGET(addwin));
569 static void on_set_value_activate (GtkMenuItem *menuitem,
570 gpointer user_data)
572 GtkWidget *entry_name, *entry_type, *entry_value;
573 GtkDialog *addwin = GTK_DIALOG(create_SetValueDialog(&entry_name, &entry_type, &entry_value));
574 gint result = gtk_dialog_run(addwin);
575 if (result == GTK_RESPONSE_OK)
577 WERROR error;
578 struct registry_value *val;
580 reg_string_to_val(mem_ctx,str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type))), gtk_entry_get_text(GTK_ENTRY(entry_value)), &val);
582 error = reg_val_set(current_key, gtk_entry_get_text(GTK_ENTRY(entry_name)), val->data_type, val->data_blk, val->data_len);
584 if (!W_ERROR_IS_OK(error)) {
585 gtk_show_werror(NULL, error);
588 gtk_widget_destroy(GTK_WIDGET(addwin));
591 static void on_find_activate (GtkMenuItem *menuitem,
592 gpointer user_data)
594 GtkDialog *findwin = GTK_DIALOG(create_FindDialog());
595 /*gint result = gtk_dialog_run(findwin);
596 FIXME */
597 gtk_widget_destroy(GTK_WIDGET(findwin));
600 static void on_about_activate (GtkMenuItem *menuitem,
601 gpointer user_data)
603 GtkDialog *aboutwin = GTK_DIALOG(create_gtk_samba_about_dialog("gregedit"));
604 gtk_dialog_run(aboutwin);
605 gtk_widget_destroy(GTK_WIDGET(aboutwin));
608 gboolean on_key_activate(GtkTreeSelection *selection,
609 GtkTreeModel *model,
610 GtkTreePath *path,
611 gboolean path_currently_selected,
612 gpointer data)
614 int i;
615 struct registry_key *k;
616 struct registry_value *val;
617 WERROR error;
618 GtkTreeIter parent;
620 gtk_widget_set_sensitive(mnu_add_key, !path_currently_selected);
621 gtk_widget_set_sensitive(mnu_set_value, !path_currently_selected);
622 gtk_widget_set_sensitive(mnu_del_key, !path_currently_selected);
623 gtk_widget_set_sensitive(mnu_del_value, !path_currently_selected);
624 gtk_widget_set_sensitive(mnu_find, !path_currently_selected);
626 if(path_currently_selected) {
627 current_key = NULL;
628 return TRUE;
631 gtk_tree_model_get_iter(GTK_TREE_MODEL(store_keys), &parent, path);
632 gtk_tree_model_get(GTK_TREE_MODEL(store_keys), &parent, 1, &k, -1);
634 current_key = k;
636 if (!k) return FALSE;
638 gtk_list_store_clear(store_vals);
640 for(i = 0; W_ERROR_IS_OK(error = reg_key_get_value_by_index(mem_ctx, k, i, &val)); i++) {
641 GtkTreeIter iter;
642 gtk_list_store_append(store_vals, &iter);
643 gtk_list_store_set (store_vals,
644 &iter,
646 val->name,
648 str_regtype(val->data_type),
650 reg_val_data_string(mem_ctx, val),
652 val,
653 -1);
656 if(!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) {
657 gtk_show_werror(mainwin, error);
658 return FALSE;
660 return TRUE;
663 static GtkWidget* create_mainwin (void)
665 GtkWidget *vbox1;
666 GtkWidget *menubar;
667 GtkWidget *menu_file;
668 GtkWidget *menu_file_menu;
669 GtkWidget *open_nt4;
670 GtkWidget *open_ldb;
671 GtkWidget *open_w95;
672 GtkWidget *open_gconf;
673 GtkWidget *open_remote;
674 GtkWidget *open_local;
675 GtkWidget *separatormenuitem1;
676 GtkWidget *quit;
677 GtkWidget *men_key;
678 GtkWidget *men_key_menu;
679 GtkCellRenderer *renderer;
680 GtkTreeViewColumn *curcol;
681 GtkWidget *help;
682 GtkWidget *help_menu;
683 GtkWidget *about;
684 GtkWidget *hbox1;
685 GtkWidget *scrolledwindow1;
686 GtkWidget *scrolledwindow2;
687 GtkWidget *statusbar;
688 GtkAccelGroup *accel_group;
690 accel_group = gtk_accel_group_new ();
692 mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
693 gtk_window_set_title (GTK_WINDOW (mainwin), "Registry editor");
694 gtk_window_set_default_size (GTK_WINDOW (mainwin), 642, 562);
696 vbox1 = gtk_vbox_new (FALSE, 0);
697 gtk_container_add (GTK_CONTAINER (mainwin), vbox1);
699 menubar = gtk_menu_bar_new ();
700 gtk_box_pack_start (GTK_BOX (vbox1), menubar, FALSE, FALSE, 0);
702 menu_file = gtk_menu_item_new_with_mnemonic ("_File");
703 gtk_container_add (GTK_CONTAINER (menubar), menu_file);
705 menu_file_menu = gtk_menu_new ();
706 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_file), menu_file_menu);
708 open_local = gtk_menu_item_new_with_mnemonic ("Open _Local");
709 gtk_container_add (GTK_CONTAINER (menu_file_menu), open_local);
710 g_signal_connect ((gpointer) open_local, "activate",
711 G_CALLBACK (on_open_local_activate), NULL);
713 if(reg_has_backend("rpc")) {
714 open_remote = gtk_menu_item_new_with_mnemonic ("Open _Remote");
715 gtk_container_add (GTK_CONTAINER (menu_file_menu), open_remote);
717 g_signal_connect ((gpointer) open_remote, "activate",
718 G_CALLBACK (on_open_remote_activate),
719 NULL);
722 separatormenuitem1 = gtk_menu_item_new ();
723 gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1);
724 gtk_widget_set_sensitive (separatormenuitem1, FALSE);
727 if(reg_has_backend("nt4")) {
728 open_nt4 = gtk_image_menu_item_new_with_mnemonic("Open _NT4 file");
729 gtk_container_add (GTK_CONTAINER (menu_file_menu), open_nt4);
731 g_signal_connect(open_nt4, "activate",
732 G_CALLBACK (on_open_file_activate),
733 discard_const_p(char, "nt4"));
736 if(reg_has_backend("w95")) {
737 open_w95 = gtk_image_menu_item_new_with_mnemonic("Open Win_9x file");
738 gtk_container_add (GTK_CONTAINER (menu_file_menu), open_w95);
740 g_signal_connect (open_w95, "activate",
741 G_CALLBACK (on_open_file_activate),
742 discard_const_p(char, "w95"));
745 if(reg_has_backend("gconf")) {
746 open_gconf = gtk_image_menu_item_new_with_mnemonic ("Open _GConf");
747 gtk_container_add (GTK_CONTAINER (menu_file_menu), open_gconf);
749 g_signal_connect ((gpointer) open_gconf, "activate",
750 G_CALLBACK (on_open_gconf_activate),
751 NULL);
754 if(reg_has_backend("ldb")) {
755 open_ldb = gtk_image_menu_item_new_with_mnemonic("Open _LDB file");
756 gtk_container_add (GTK_CONTAINER (menu_file_menu), open_ldb);
758 g_signal_connect(open_ldb, "activate",
759 G_CALLBACK (on_open_file_activate),
760 discard_const_p(char, "ldb"));
763 save = gtk_image_menu_item_new_from_stock ("gtk-save", accel_group);
764 gtk_widget_set_sensitive( save, False );
765 gtk_container_add (GTK_CONTAINER (menu_file_menu), save);
767 save_as = gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group);
768 gtk_widget_set_sensitive( save_as, False );
769 gtk_container_add (GTK_CONTAINER (menu_file_menu), save_as);
771 separatormenuitem1 = gtk_menu_item_new ();
772 gtk_container_add (GTK_CONTAINER (menu_file_menu), separatormenuitem1);
773 gtk_widget_set_sensitive (separatormenuitem1, FALSE);
775 quit = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
776 gtk_container_add (GTK_CONTAINER (menu_file_menu), quit);
778 men_key = gtk_menu_item_new_with_mnemonic ("_Key");
779 gtk_container_add (GTK_CONTAINER (menubar), men_key);
781 men_key_menu = gtk_menu_new ();
782 gtk_menu_item_set_submenu (GTK_MENU_ITEM (men_key), men_key_menu);
784 mnu_add_key = gtk_image_menu_item_new_with_mnemonic("Add _Subkey");
785 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_add_key), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU));
787 gtk_widget_set_sensitive(mnu_add_key, False);
788 gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_add_key);
790 mnu_set_value = gtk_image_menu_item_new_with_mnemonic("Set _Value");
791 gtk_widget_set_sensitive(mnu_set_value, False);
792 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_set_value), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU));
793 gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_set_value);
795 mnu_find = gtk_image_menu_item_new_from_stock ("gtk-find", accel_group);
796 gtk_widget_set_sensitive(mnu_find, False);
797 gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_find);
799 mnu_del_key = gtk_image_menu_item_new_with_mnemonic ("Delete Key");
800 gtk_widget_set_sensitive(mnu_del_key, False);
801 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU));
802 gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_del_key);
804 mnu_del_value = gtk_image_menu_item_new_with_mnemonic ("Delete Value");
805 gtk_widget_set_sensitive(mnu_del_value, False);
806 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU));
807 gtk_container_add (GTK_CONTAINER (men_key_menu), mnu_del_value);
810 help = gtk_menu_item_new_with_mnemonic ("_Help");
811 gtk_container_add (GTK_CONTAINER (menubar), help);
813 help_menu = gtk_menu_new ();
814 gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu);
816 about = gtk_menu_item_new_with_mnemonic ("_About");
817 gtk_container_add (GTK_CONTAINER (help_menu), about);
819 hbox1 = gtk_hbox_new (FALSE, 0);
820 gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
822 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
823 gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow1, TRUE, TRUE, 0);
825 tree_keys = gtk_tree_view_new ();
827 /* Column names */
828 curcol = gtk_tree_view_column_new ();
829 gtk_tree_view_column_set_title(curcol, "Name");
830 renderer = gtk_cell_renderer_text_new();
831 gtk_tree_view_column_pack_start(curcol, renderer, True);
833 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_keys), curcol);
835 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
836 gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree_keys);
837 store_keys = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
838 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_keys), GTK_TREE_MODEL(store_keys));
839 g_object_unref(store_keys);
841 gtk_tree_selection_set_select_function (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys)), on_key_activate, NULL, NULL);
843 g_signal_connect ((gpointer) tree_keys, "row-expanded",
844 G_CALLBACK (expand_key),
845 NULL);
848 scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL);
849 gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow2, TRUE, TRUE, 0);
851 tree_vals = gtk_tree_view_new ();
852 /* Column names */
854 curcol = gtk_tree_view_column_new ();
855 gtk_tree_view_column_set_title(curcol, "Name");
856 renderer = gtk_cell_renderer_text_new();
857 gtk_tree_view_column_pack_start(curcol, renderer, True);
858 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol);
859 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
861 curcol = gtk_tree_view_column_new ();
862 gtk_tree_view_column_set_title(curcol, "Type");
863 renderer = gtk_cell_renderer_text_new();
864 gtk_tree_view_column_pack_start(curcol, renderer, True);
865 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol);
866 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 1);
868 curcol = gtk_tree_view_column_new ();
869 gtk_tree_view_column_set_title(curcol, "Value");
870 renderer = gtk_cell_renderer_text_new();
871 gtk_tree_view_column_pack_start(curcol, renderer, True);
872 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals), curcol);
873 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 2);
876 gtk_container_add (GTK_CONTAINER (scrolledwindow2), tree_vals);
878 store_vals = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
879 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_vals), GTK_TREE_MODEL(store_vals));
880 g_object_unref(store_vals);
882 statusbar = gtk_statusbar_new ();
883 gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
884 gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar), FALSE);
886 g_signal_connect ((gpointer) save, "activate",
887 G_CALLBACK (on_save_activate),
888 NULL);
889 g_signal_connect ((gpointer) save_as, "activate",
890 G_CALLBACK (on_save_as_activate),
891 NULL);
892 g_signal_connect ((gpointer) quit, "activate",
893 G_CALLBACK (on_quit_activate),
894 NULL);
895 g_signal_connect ((gpointer) mnu_add_key, "activate",
896 G_CALLBACK (on_add_key_activate),
897 NULL);
898 g_signal_connect ((gpointer) mnu_set_value, "activate",
899 G_CALLBACK (on_set_value_activate),
900 NULL);
901 g_signal_connect ((gpointer) mnu_find, "activate",
902 G_CALLBACK (on_find_activate),
903 NULL);
904 g_signal_connect ((gpointer) mnu_del_key, "activate",
905 G_CALLBACK (on_delete_key_activate),
906 NULL);
907 g_signal_connect ((gpointer) mnu_del_value, "activate",
908 G_CALLBACK (on_delete_value_activate),
909 NULL);
910 g_signal_connect ((gpointer) about, "activate",
911 G_CALLBACK (on_about_activate),
912 NULL);
914 g_signal_connect ((gpointer) tree_vals, "row-activated",
915 G_CALLBACK (on_value_activate),
916 NULL);
919 gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group);
921 return mainwin;
924 static GtkWidget* create_openfilewin (void)
926 GtkWidget *ok_button;
927 GtkWidget *cancel_button;
929 openfilewin = gtk_file_selection_new ("Select File");
930 gtk_container_set_border_width (GTK_CONTAINER (openfilewin), 10);
932 ok_button = GTK_FILE_SELECTION (openfilewin)->ok_button;
933 GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
935 cancel_button = GTK_FILE_SELECTION (openfilewin)->cancel_button;
936 GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
938 return openfilewin;
941 static GtkWidget* create_savefilewin (void)
943 GtkWidget *ok_button;
944 GtkWidget *cancel_button;
946 savefilewin = gtk_file_selection_new ("Select File");
947 gtk_container_set_border_width (GTK_CONTAINER (savefilewin), 10);
949 ok_button = GTK_FILE_SELECTION (savefilewin)->ok_button;
950 GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
952 cancel_button = GTK_FILE_SELECTION (savefilewin)->cancel_button;
953 GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
955 return savefilewin;
958 int main(int argc, char *argv[])
960 poptContext pc;
961 WERROR error;
962 int opt;
963 struct poptOption long_options[] = {
964 POPT_AUTOHELP
965 POPT_TABLEEND
968 gregedit_init_subsystems;
970 lp_load(dyn_CONFIGFILE,True,False,False);
971 load_interfaces();
973 gtk_init (&argc, &argv);
974 mem_ctx = talloc_init("gregedit");
976 pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
978 while((opt = poptGetNextOpt(pc)) != -1) {
981 error = reg_open_local(&registry);
982 if(!W_ERROR_IS_OK(error)) {
983 gtk_show_werror(mainwin, error);
984 return -1;
986 mainwin = create_mainwin ();
987 registry_load_root();
989 gtk_widget_show_all (mainwin);
991 gtk_main ();
993 talloc_destroy(mem_ctx);
994 return 0;