diff options
Diffstat (limited to 'source3')
-rwxr-xr-x | source3/python/gtdbtool | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/source3/python/gtdbtool b/source3/python/gtdbtool new file mode 100755 index 0000000000..cb88792acc --- /dev/null +++ b/source3/python/gtdbtool @@ -0,0 +1,166 @@ +#!/usr/bin/env python + +from gtk import * +import sys +import tdb +import string +import re + +# +# The gdbtool user interface. The design here is to keep all the gtk stuff +# separate from the tdb stuff so all the user interface magic is stored +# here. +# + +class gtdbtool: + + # Initialise the user interface. A dictionary argument is passed + # in which is the dictionary to display keys and values on the left + # hand and right hand side of the user interface respectively.""" + + def __init__(self, dict): + self.dict = dict + + # Create and configure user interface widgets. A string argument is + # used to set the window title. + + def build_ui(self, title): + win = GtkWindow() + win.set_title(title) + + win.connect("destroy", mainquit) + + hpaned = GtkHPaned() + win.add(hpaned) + hpaned.set_border_width(5) + hpaned.show() + + vbox = GtkVBox() + hpaned.add1(vbox) + vbox.show() + + scrolled_win = GtkScrolledWindow() + scrolled_win.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC) + vbox.pack_start(scrolled_win) + scrolled_win.set_usize(350,400) + scrolled_win.show() + + hbox = GtkHBox() + vbox.pack_end(hbox) + hbox.show() + + label = GtkLabel("Filter:") + hbox.pack_start(label, expand = 0) + label.show() + + self.entry = GtkEntry() + hbox.pack_end(self.entry) + self.entry.show() + + self.entry.connect("activate", self.filter_activated) + + self.list = GtkList() + self.list.set_selection_mode(SELECTION_MULTIPLE) + self.list.set_selection_mode(SELECTION_BROWSE) + scrolled_win.add_with_viewport(self.list) + self.list.show() + + self.list.connect("select_child", self.key_selected) + + scrolled_win = GtkScrolledWindow() + scrolled_win.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC) + hpaned.add2(scrolled_win) + scrolled_win.set_usize(350,400) + scrolled_win.show() + + self.text = GtkText() + self.text.set_editable(FALSE) + scrolled_win.add_with_viewport(self.text) + self.text.show() + + self.text.connect("event", self.event_handler) + + self.menu = GtkMenu() + self.menu.show() + + self.filter_regex = "" + + self.update_keylist() + + win.show() + + # Add a key to the left hand side of the user interface + + def add_key(self, key): + display_key = self.display_key(key) + list_item = GtkListItem(display_key) + list_item.set_data("raw_key", key) # Store raw key in item data + self.list.add(list_item) + list_item.show() + + # Event handler registered by build_ui() + + def event_handler(self, event, menu): + return FALSE + + # Set the text to appear in the right hand side of the user interface + + def set_value_text(self, text): + self.text.delete_text(0, self.text.get_length()) + self.text.insert_defaults(text) + + # This function is called when a key is selected in the left hand side + # of the user interface. + + def key_selected(self, list, list_item): + key = list_item.children()[0].get() + self.set_value_text(t[list_item.get_data("raw_key")]) + + # Refresh the key list by removing all items and re-inserting them. + # Items are only inserted if they pass through the filter regexp. + + def update_keylist(self): + self.list.remove_items(self.list.children()) + self.set_value_text("") + for k in self.dict.keys(): + if re.match(self.filter_regex, k): + self.add_key(k) + + # Invoked when the user hits return in the filter text entry widget. + + def filter_activated(self, entry): + self.filter_regex = entry.get_text() + self.update_keylist() + + # + # Public methods + # + + # Set a function that translates between how keys look in the user + # interface (displayed keys) versus how they are represented in the tdb + # (raw keys). + + def set_display_key_fn(self, fn): + self.display_key = fn + +# Open handle on tdb + +t = tdb.open(sys.argv[1]) + +# Create user interface + +w = gtdbtool(t) + +# Set up a key display function. A lot of keys have \x00 appended to the +# end which mucks up gtk. + +def display_key_x00(key): + return string.replace(key, "\x00", "") + +w.set_display_key_fn(display_key_x00) + +# Show user interface + +w.build_ui("gtdbtool: %s" % sys.argv[1]) + +mainloop() |