class Spy: def __init__(self): self.timer = 0; self.prev_selection = "" self.clipboard = gtk.clipboard_get(gdk.SELECTION_PRIMARY) self.conf = SlogConf() self.spy_view = None #Thread function def __fuzzy_search(self, word): """ Выполняет нечеткий поиск слова <word>, в словарях отмеченных в конфигурации как <spy>. Выводит результат как список, элементами которого являются гипер-ссылки на похожие слова. """ all_lines = [] used_dicts = self.conf.get_sl_spy_dicts() for dic in used_dicts: filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_FUZZY, filename) if lines != []: html = [] html.append(libsl.get_dict_html_block(filename)) html.append("<dl>") for item in lines: html.append("<li><a href='%s|%s'>%s</a></li>" % (dic, item, item)) html.append("</dl>") all_lines.append("".join(html)) # Cancelled.. if not self.spy_view.get_property("visible"): return translate = "<body>%s</body>" % ("".join(all_lines)) gobject.idle_add(self.spy_view.set_translate, word, translate) def __get_translate(self, word): """ Возвращает доступные статьи перевода слова <word>, в словарях отмеченных в конфигурации как <spy>. """ all_lines = [] used_dicts = self.conf.get_sl_spy_dicts() for dic in used_dicts: filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_MATCH, filename) if lines != []: all_lines.append("".join(lines)) return all_lines def __on_clipboard_text_received(self, clipboard, text, data): """ Обработчик события появления текста в буффере обмена. Выполняет поиск слова, если не найдено ни одной статьи перевода, в отдельном потоке запускается функция нечеткого поиска. """ if text is None: return selection = text.lower().strip() if selection == "" or selection == self.prev_selection: return self.prev_selection = selection word = selection all_lines = self.__get_translate(word) if len(all_lines) == 0: translate = """ <body>This word not found.<br/> <span style='color:#4c4c4c; font-size:80%'>Searching similar words...</span> </body>""" thread = threading.Thread(target = self.__fuzzy_search, args = (word, )) thread.start() else: translate = "<body>%s</body>" % ("".join(all_lines)) self.spy_view.set_translate(word, translate) self.spy_view.popup() def __on_timer_timeout(self): if self.timer == 0: return False display = gdk.display_get_default() screen, x, y, mask = display.get_pointer() mask = mask & ((1<<13)-1) if mask & self.conf.get_mod_key(): if self.spy_view.get_property("visible") is False: self.clipboard.request_text(self.__on_clipboard_text_received) else: if self.spy_view.get_property("visible"): self.spy_view.hide() return True def __on_url_click(self, document, link): dic, word = link.split("|") filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_MATCH, filename) translate = "<body>%s</body>" % ("".join(lines)) self.spy_view.set_translate(word, translate) def start(self): self.spy_view = SpyView() self.spy_view.set_url_callback(self.__on_url_click) self.clipboard.set_text("") self.prev_selection = "" self.timer = gobject.timeout_add(300, self.__on_timer_timeout) def stop(self): self.timer = 0 self.spy_view.destroy()
class SLView(object): def __init__(self): self.conf = SlogConf() self.timer = 0 self.callbacks = {} gladefile = os.path.join(path, "xsl.glade") self.wtree = gtk.glade.XML(gladefile, domain="slog") self.wtree.signal_autoconnect(self) self.vbox = self.wtree.get_widget("sl_vbox") self.vbox.unparent() self.word_entry = self.wtree.get_widget("word_entry") self.treestore = gtk.TreeStore(str) self.treeview = self.wtree.get_widget("sl_tree") self.treeview.set_model(self.treestore) cell = gtk.CellRendererText() cell.set_property("ellipsize", pango.ELLIPSIZE_END) tvcolumn = gtk.TreeViewColumn("Result", cell, text=0) self.treeview.append_column(tvcolumn) self.treestore.append(None, [_("Enter the word, please...")]) self.word_selection = self.treeview.get_selection() self.word_selection.connect("changed", self.on_wordlist_changed) self.treemodel_lock = threading.Lock() def __fire_status_changed(self, message): callback = self.callbacks["changed"] if callback is not None: callback(message) def __fire_translate_changed(self, word, translate, newtab): callback = self.callbacks["translate_it"] if callback is not None: callback(word, translate, newtab) def on_btn_fuzzy_clicked(self, widget, data=None): word = self.word_entry.get_text() self.find_all(word, mode = libsl.SL_FIND_FUZZY) def on_btn_clear_clicked(self, widget, data=None): self.word_entry.set_text("") self.word_entry.grab_focus() self.treestore.clear() self.treestore.append(None, [_("Enter the word, please...")]) self.__fire_status_changed("") def on_timer_timeout(self): self.timer = 0; word = self.word_entry.get_text().lower() self.find_all(word) def on_word_changed(self, widget, data=None): if self.timer == 0: self.timer = gobject.timeout_add(500, self.on_timer_timeout) def on_word_entry_activate(self, widget, data=None): word = widget.get_text().lower() self.find_all(word) def on_wordlist_changed(self, selection): model, treeiter = selection.get_selected() self.find_word(treeiter, newTab = False) def __thread_find(self, node, word, mode, dict_name): filename = self.conf.get_dic_path(dict_name) items = libsl.find_word(word, mode, filename) self.treemodel_lock.acquire() if items == []: self.treestore.remove(node) else: for item in items: self.treestore.append(node, [item]) self.treemodel_lock.release() def __get_n_rows(self): """ Функция возвращает количество выведенных вариантов слова """ count = 0 it = self.treestore.get_iter_first() while it: if self.treestore.iter_has_child(it): ti = self.treestore.iter_children(it) while ti: count += 1 ti = self.treestore.iter_next(ti) it = self.treestore.iter_next(it) return count def find_all(self, word, mode = libsl.SL_FIND_LIST): """ Выполняет поиск слова в отмеченных пользователем словарях, и добавляет найденные варианты на панель результатов поиска. """ if word == "": return self.treestore.clear() threads = [] dictionaries = self.conf.get_sl_used_dicts() for dic in dictionaries: node = self.treestore.append(None, [dic]) t = threading.Thread(target = self.__thread_find, args = (node, word, mode, dic)) threads.append(t) t.start() for t in threads: t.join() count = self.__get_n_rows() if count>0: self.treeview.expand_all() self.word_selection.select_path((0,0)) else: self.treestore.append(None, [_("This word is not found")]) self.__fire_status_changed(_("Total: %i") % (count)) def find_word(self, treeiter, mode = libsl.SL_FIND_MATCH, newTab=False): if treeiter is None: return parentiter = self.treestore.iter_parent(treeiter) if parentiter is None: return word = self.treestore.get_value(treeiter, 0) dic = self.treestore.get_value(parentiter, 0) filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, mode, filename) translate = "<body>%s</body>" % ("".join(lines)) self.__fire_translate_changed(word, translate, newTab) # ================================ SLog Plugins API ============================ def connect(self, event, callback): self.callbacks[event] = callback def get_panel(self): return self.vbox def grab_focus(self): self.word_entry.grab_focus() def clear(self): self.word_entry.set_text("") self.word_entry.grab_focus() def configure(self, window): dlg = self.wtree.get_widget("pref_dialog") dlg.set_transient_for(window) dir_entry = self.wtree.get_widget("entry_folder") dir_entry.set_current_folder(self.conf.sl_dicts_dir) response = dlg.run() if response == gtk.RESPONSE_OK: self.conf.sl_dicts_dir = dir_entry.get_filename() dlg.hide()
class Spy: def __init__(self): self.timer = 0; self.prev_selection = "" self.clipboard = gtk.clipboard_get(gdk.SELECTION_PRIMARY) self.conf = SlogConf() self.spy_view = None #Thread function def __fuzzy_search(self, word): """ Выполняет нечеткий поиск слова <word>, в словарях отмеченных в конфигурации как <spy>. Выводит результат как список, элементами которого являются гипер-ссылки на похожие слова. """ all_lines = [] used_dicts = self.conf.get_sl_spy_dicts() for dic in used_dicts: filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_FUZZY, filename) if lines != []: html = [] html.append(libsl.get_dict_html_block(filename)) html.append("<dl>") for item in lines: html.append("<li><a href='%s|%s'>%s</a></li>" % (dic, item, item)) html.append("</dl>") all_lines.append("".join(html)) # Cancelled.. if not self.spy_view.get_property("visible"): return translate = "<body>%s</body>" % ("".join(all_lines)) gobject.idle_add(self.spy_view.set_translate, word, translate) def __get_translate(self, word): """ Возвращает доступные статьи перевода слова <word>, в словарях отмеченных в конфигурации как <spy>. """ all_lines = [] used_dicts = self.conf.get_sl_spy_dicts() for dic in used_dicts: filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_MATCH, filename) if lines != []: all_lines.append("".join(lines)) return all_lines def __on_clipboard_text_received(self, clipboard, text, data): """ Обработчик события появления текста в буффере обмена. Выполняет поиск слова, если не найдено ни одной статьи перевода, в отдельном потоке запускается функция нечеткого поиска. """ if text is None: return selection = text.lower().strip() if selection == "" or selection == self.prev_selection: return self.prev_selection = selection word = selection all_lines = self.__get_translate(word) if len(all_lines) == 0: translate = """ <body>This word not found.<br/> <span style='color:#4c4c4c; font-size:80%'>Searching similar words...</span> </body>""" thread = threading.Thread(target = self.__fuzzy_search, args = (word, )) thread.start() else: translate = "<body>%s</body>" % ("".join(all_lines)) self.spy_view.set_translate(word, translate) self.spy_view.popup() def __on_timer_timeout(self): if self.timer == 0: return False display = gdk.display_get_default() screen, x, y, mask = display.get_pointer() mask = mask & ((1<<13)-1) if mask & self.conf.get_mod_key(): if self.spy_view.get_property("visible") is False: self.clipboard.request_text(self.__on_clipboard_text_received) else: if self.spy_view.get_property("visible"): self.spy_view.hide() return True def __on_url_click(self, view, url, type_): dic, word = url.split("|") filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_MATCH, filename) translate = "<body>%s</body>" % ("".join(lines)) self.spy_view.set_translate(word, translate) def start(self): self.spy_view = SpyView() self.spy_view.set_url_callback(self.__on_url_click) self.clipboard.set_text("") self.prev_selection = "" self.timer = gobject.timeout_add(300, self.__on_timer_timeout) def stop(self): self.timer = 0 self.spy_view.destroy()
class SLView(gtk.VBox): def __init__(self): gtk.VBox.__init__(self, False, 0) self.conf = SlogConf() self.timer = 0 self.callbacks = {} tooltips = gtk.Tooltips() hbox = gtk.HBox(False, 0) hbox.set_border_width(4) self.pack_start(hbox, False, False, 0) self.word_entry = gtk.Entry() self.word_entry.set_size_request(60, -1) self.word_entry.connect("activate", self.on_word_entry_activate) self.word_entry.connect("changed", self.on_word_entry_changed) hbox.pack_start(self.word_entry, True, True, 4) btn_clear = ghlp.create_speed_button(gtk.STOCK_CLEAR) tooltips.set_tip(btn_clear, _("Clear field")) btn_clear.connect("clicked", self.on_btn_clear_clicked) hbox.pack_start(btn_clear, False, False, 0) sw = gtk.ScrolledWindow() sw.set_border_width(4) sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_IN) self.pack_start(sw, True, True, 0) self.treestore = gtk.TreeStore(str) self.treeview = gtk.TreeView(self.treestore) self.treeview.set_headers_visible(False) self.treeview.set_rules_hint(True) self.treeview.connect("row-activated", self.on_row_activated) sw.add(self.treeview) cell = gtk.CellRendererText() cell.set_property("ellipsize", pango.ELLIPSIZE_END) tvcolumn = gtk.TreeViewColumn("Result", cell, text=0) self.treeview.append_column(tvcolumn) self.treestore.append(None, [_("Enter the word, please...")]) self.word_selection = self.treeview.get_selection() self.word_selection.connect("changed", self.on_wordlist_changed) img = gtk.image_new_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU) btn_fuzzy = gtk.Button(_("Fuzzy Search")) btn_fuzzy.set_image(img) btn_fuzzy.set_border_width(4) btn_fuzzy.connect("clicked", self.on_btn_fuzzy_clicked) self.pack_start(btn_fuzzy, False, True, 0) def __fire_status_changed(self, message): callback = self.callbacks["changed"] if callback is not None: callback(message) def __fire_translate_changed(self, word, translate, newtab): callback = self.callbacks["translate_it"] if callback is not None: callback(word, translate, newtab) def on_row_activated(self, widget, path, column, data=None): treeiter = self.treestore.get_iter(path) self.find_word(treeiter, newTab=True) def on_btn_fuzzy_clicked(self, widget, data=None): word = self.word_entry.get_text().lower() self.find_list(word, mode=libsl.SL_FIND_FUZZY) def on_btn_clear_clicked(self, widget, data=None): self.word_entry.set_text("") self.word_entry.grab_focus() self.treestore.clear() self.treestore.append(None, [_("Enter the word, please...")]) self.__fire_status_changed("") def on_timer_timeout(self): self.timer = 0 word = self.word_entry.get_text().lower() self.find_list(word) def on_word_entry_changed(self, widget, data=None): if self.timer == 0: self.timer = gobject.timeout_add(500, self.on_timer_timeout) def on_word_entry_activate(self, widget, data=None): word = widget.get_text().lower() self.find_list(word) def on_wordlist_changed(self, selection): model, treeiter = selection.get_selected() self.find_word(treeiter, newTab=False) def find_list(self, word, mode=libsl.SL_FIND_LIST): if word == "": return count = 0 model = self.treestore model.clear() dictionaries = self.conf.get_used_dicts() for dic in dictionaries: filename = self.conf.get_dic_path(dic) items = libsl.find_word(word, mode, filename) count += len(items) if items == []: continue root_node = model.append(None, [dic]) for item in items: model.append(root_node, [item]) if count > 0: self.treeview.expand_all() self.word_selection.select_path((0, 0)) else: model.append(None, [_("This word is not found")]) self.__fire_status_changed(_("Total: %i") % (count)) def find_word(self, treeiter, mode=libsl.SL_FIND_MATCH, newTab=False): if treeiter is None: return parentiter = self.treestore.iter_parent(treeiter) if parentiter is None: return word = self.treestore.get_value(treeiter, 0) dic = self.treestore.get_value(parentiter, 0) filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, mode, filename) translate = "<body>%s</body>" % ("".join(lines)) self.__fire_translate_changed(word, translate, newTab) def connect(self, event, callback): self.callbacks[event] = callback def grab_focus(self): self.word_entry.grab_focus() # ================================ Plugin support ============================ def configure(self, window): conf = SlogConf() dlg = gtk.Dialog(plugin_name, window, 0, (gtk.STOCK_OK, gtk.RESPONSE_OK)) hbox = gtk.HBox(False, 8) hbox.set_border_width(8) dlg.vbox.pack_start(hbox, False, False, 0) stock = gtk.image_new_from_stock(gtk.STOCK_DIALOG_QUESTION, gtk.ICON_SIZE_DIALOG) hbox.pack_start(stock, False, False, 0) label = gtk.Label(_("Dictionaries dir:")) hbox.pack_start(label, False, False, 0) dir_entry = gtk.Entry() dir_entry.set_text(conf.sl_dicts_dir) hbox.pack_start(dir_entry, True, True, 0) btn_browse = gtk.Button("...") btn_browse.connect("clicked", self.on_browse_clicked, window, dir_entry) hbox.pack_start(btn_browse, False, False, 0) label.set_mnemonic_widget(dir_entry) dlg.show_all() response = dlg.run() if response == gtk.RESPONSE_OK: ddir = dir_entry.get_text() if not os.path.exists(ddir): ghlp.show_error(window, _("Path not exists!")) conf.sl_dicts_dir = ddir dlg.destroy() def on_browse_clicked(self, widget, window, entry): chooser = gtk.FileChooserDialog("Open..", window, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)) dicts_dir = entry.get_text() if os.path.exists(dicts_dir): chooser.set_current_folder(dicts_dir) response = chooser.run() if response == gtk.RESPONSE_OK: path = chooser.get_filename() entry.set_text(path) chooser.destroy()
class SLView(object): def __init__(self): self.conf = SlogConf() self.timer = 0 self.callbacks = {} gladefile = os.path.join(path, "xsl.glade") self.wtree = gtk.glade.XML(gladefile, domain="slog") self.wtree.signal_autoconnect(self) self.vbox = self.wtree.get_widget("sl_vbox") self.vbox.unparent() self.word_entry = self.wtree.get_widget("word_entry") self.treestore = gtk.TreeStore(str) self.treeview = self.wtree.get_widget("sl_tree") self.treeview.set_model(self.treestore) cell = gtk.CellRendererText() cell.set_property("ellipsize", pango.ELLIPSIZE_END) tvcolumn = gtk.TreeViewColumn("Result", cell, text=0) self.treeview.append_column(tvcolumn) self.treestore.append(None, [_("Enter the word, please...")]) self.word_selection = self.treeview.get_selection() self.word_selection.connect("changed", self.on_wordlist_changed) self.treemodel_lock = threading.Lock() def __fire_status_changed(self, message): callback = self.callbacks["changed"] if callback is not None: callback(message) def __fire_translate_changed(self, word, translate, newtab): callback = self.callbacks["translate_it"] if callback is not None: callback(word, translate, newtab) def on_btn_fuzzy_clicked(self, widget, data=None): word = self.word_entry.get_text() self.find_all(word, mode=libsl.SL_FIND_FUZZY) def on_btn_clear_clicked(self, widget, data=None): self.word_entry.set_text("") self.word_entry.grab_focus() self.treestore.clear() self.treestore.append(None, [_("Enter the word, please...")]) self.__fire_status_changed("") def on_timer_timeout(self): self.timer = 0 word = self.word_entry.get_text().lower() self.find_all(word) def on_word_changed(self, widget, data=None): if self.timer == 0: self.timer = gobject.timeout_add(500, self.on_timer_timeout) def on_word_entry_activate(self, widget, data=None): word = widget.get_text().lower() self.find_all(word) def on_wordlist_changed(self, selection): model, treeiter = selection.get_selected() self.find_word(treeiter, newTab=False) def __thread_find(self, node, word, mode, dict_name): filename = self.conf.get_dic_path(dict_name) items = libsl.find_word(word, mode, filename) self.treemodel_lock.acquire() if items == []: self.treestore.remove(node) else: for item in items: self.treestore.append(node, [item]) self.treemodel_lock.release() def __get_n_rows(self): """ Функция возвращает количество выведенных вариантов слова """ count = 0 it = self.treestore.get_iter_first() while it: if self.treestore.iter_has_child(it): ti = self.treestore.iter_children(it) while ti: count += 1 ti = self.treestore.iter_next(ti) it = self.treestore.iter_next(it) return count def find_all(self, word, mode=libsl.SL_FIND_LIST): """ Выполняет поиск слова в отмеченных пользователем словарях, и добавляет найденные варианты на панель результатов поиска. """ if word == "": return self.treestore.clear() threads = [] dictionaries = self.conf.get_sl_used_dicts() for dic in dictionaries: node = self.treestore.append(None, [dic]) t = threading.Thread(target=self.__thread_find, args=(node, word, mode, dic)) threads.append(t) t.start() for t in threads: t.join() count = self.__get_n_rows() if count > 0: self.treeview.expand_all() self.word_selection.select_path((0, 0)) else: self.treestore.append(None, [_("This word is not found")]) self.__fire_status_changed(_("Total: %i") % (count)) def find_word(self, treeiter, mode=libsl.SL_FIND_MATCH, newTab=False): if treeiter is None: return parentiter = self.treestore.iter_parent(treeiter) if parentiter is None: return word = self.treestore.get_value(treeiter, 0) dic = self.treestore.get_value(parentiter, 0) filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, mode, filename) translate = "<body>%s</body>" % ("".join(lines)) self.__fire_translate_changed(word, translate, newTab) # ================================ SLog Plugins API ============================ def connect(self, event, callback): self.callbacks[event] = callback def get_panel(self): return self.vbox def grab_focus(self): self.word_entry.grab_focus() def clear(self): self.word_entry.set_text("") def configure(self, window): dlg = self.wtree.get_widget("pref_dialog") dlg.set_transient_for(window) dir_entry = self.wtree.get_widget("entry_folder") dir_entry.set_current_folder(self.conf.sl_dicts_dir) response = dlg.run() if response == gtk.RESPONSE_OK: self.conf.sl_dicts_dir = dir_entry.get_filename() dlg.hide()
class Spy: def __init__(self): self.timer = 0; self.prev_selection = "" self.clipboard = gtk.clipboard_get(gdk.SELECTION_PRIMARY) self.conf = SlogConf() self.spy_view = None #Thread function def __fuzzy_search(self, word): all_lines = [] used_dicts = self.conf.get_spy_dicts() for dic in used_dicts: filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_FUZZY, filename) if lines != []: html = [] html.append(libsl.get_dict_html_block(filename)) html.append("<dl>") for item in lines: html.append("<li><a href='%s|%s'>%s</a></li>" % (dic, item, item)) html.append("</dl>") all_lines.append("".join(html)) # Cancelled.. if not self.spy_view.get_property("visible"): return translate = "<body>%s</body>" % ("".join(all_lines)) gobject.idle_add(self.spy_view.set_translate, word, translate) def __get_translate(self, word): all_lines = [] used_dicts = self.conf.get_spy_dicts() for dic in used_dicts: filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_MATCH, filename) if lines != []: all_lines.append("".join(lines)) return all_lines def __on_clipboard_text_received(self, clipboard, text, data): if text is None: return selection = text.lower().strip() if selection == "" or selection == self.prev_selection: return self.prev_selection = selection #TODO: remove characters like , . ; word = selection all_lines = self.__get_translate(word) if len(all_lines) == 0: translate = """ <body>This word not found.<br/> <span style='color:#4c4c4c; font-size:80%'>Searching similar words...</span> </body>""" thread = threading.Thread(target = self.__fuzzy_search, args = (word, )) thread.start() else: translate = "<body>%s</body>" % ("".join(all_lines)) self.spy_view.set_translate(word, translate) self.spy_view.popup() def __on_timer_timeout(self): if self.timer == 0: return False display = gdk.display_get_default() screen, x, y, mask = display.get_pointer() mask = mask & ((1<<13)-1) if mask & self.conf.get_mod_key(): if self.spy_view.get_property("visible") is False: self.clipboard.request_text(self.__on_clipboard_text_received) else: if self.spy_view.get_property("visible"): self.spy_view.hide() return True def __on_url_click(self, view, url, type_): dic, word = url.split("|") filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, libsl.SL_FIND_MATCH, filename) translate = "<body>%s</body>" % ("".join(lines)) self.spy_view.set_translate(word, translate) def start(self): self.spy_view = SpyView() self.spy_view.set_url_callback(self.__on_url_click) self.clipboard.set_text("") self.prev_selection = "" self.timer = gobject.timeout_add(300, self.__on_timer_timeout) def stop(self): self.timer = 0 self.spy_view.destroy()
class SLView(gtk.VBox): def __init__(self): gtk.VBox.__init__(self, False, 0) self.conf = SlogConf() self.timer = 0 self.callbacks = {} tooltips = gtk.Tooltips() hbox = gtk.HBox(False, 0) hbox.set_border_width(4) self.pack_start(hbox, False, False, 0) self.word_entry = gtk.Entry() self.word_entry.set_size_request(60, -1) self.word_entry.connect("activate", self.on_word_entry_activate) self.word_entry.connect("changed", self.on_word_entry_changed) hbox.pack_start(self.word_entry, True, True, 4) btn_clear = ghlp.create_speed_button(gtk.STOCK_CLEAR) tooltips.set_tip(btn_clear, _("Clear field")) btn_clear.connect("clicked", self.on_btn_clear_clicked) hbox.pack_start(btn_clear, False, False, 0) sw = gtk.ScrolledWindow() sw.set_border_width(4) sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_IN) self.pack_start(sw, True, True, 0) self.treestore = gtk.TreeStore(str) self.treeview = gtk.TreeView(self.treestore) self.treeview.set_headers_visible(False) self.treeview.set_rules_hint(True) self.treeview.connect("row-activated", self.on_row_activated) sw.add(self.treeview) cell = gtk.CellRendererText() cell.set_property("ellipsize", pango.ELLIPSIZE_END) tvcolumn = gtk.TreeViewColumn("Result", cell, text=0) self.treeview.append_column(tvcolumn) self.treestore.append(None, [_("Enter the word, please...")]) self.word_selection = self.treeview.get_selection() self.word_selection.connect("changed", self.on_wordlist_changed) img = gtk.image_new_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU) btn_fuzzy = gtk.Button(_("Fuzzy Search")) btn_fuzzy.set_image(img) btn_fuzzy.set_border_width(4) btn_fuzzy.connect("clicked", self.on_btn_fuzzy_clicked) self.pack_start(btn_fuzzy, False, True, 0) def __fire_status_changed(self, message): callback = self.callbacks["changed"] if callback is not None: callback(message) def __fire_translate_changed(self, word, translate, newtab): callback = self.callbacks["translate_it"] if callback is not None: callback(word, translate, newtab) def on_row_activated(self, widget, path, column, data=None): treeiter = self.treestore.get_iter(path) self.find_word(treeiter, newTab = True) def on_btn_fuzzy_clicked(self, widget, data=None): word = self.word_entry.get_text().lower() self.find_list(word, mode = libsl.SL_FIND_FUZZY) def on_btn_clear_clicked(self, widget, data=None): self.word_entry.set_text("") self.word_entry.grab_focus() self.treestore.clear() self.treestore.append(None, [_("Enter the word, please...")]) self.__fire_status_changed("") def on_timer_timeout(self): self.timer = 0; word = self.word_entry.get_text().lower() self.find_list(word) def on_word_entry_changed(self, widget, data=None): if self.timer == 0: self.timer = gobject.timeout_add(500, self.on_timer_timeout) def on_word_entry_activate(self, widget, data=None): word = widget.get_text().lower() self.find_list(word) def on_wordlist_changed(self, selection): model, treeiter = selection.get_selected() self.find_word(treeiter, newTab = False) def find_list(self, word, mode = libsl.SL_FIND_LIST): if word == "": return count = 0 model = self.treestore model.clear() dictionaries = self.conf.get_used_dicts() for dic in dictionaries: filename = self.conf.get_dic_path(dic) items = libsl.find_word(word, mode, filename) count += len(items) if items == []: continue root_node = model.append(None, [dic]) for item in items: model.append(root_node, [item]) if count>0: self.treeview.expand_all() self.word_selection.select_path((0,0)) else: model.append(None, [_("This word is not found")]) self.__fire_status_changed(_("Total: %i") % (count)) def find_word(self, treeiter, mode = libsl.SL_FIND_MATCH, newTab=False): if treeiter is None: return parentiter = self.treestore.iter_parent(treeiter) if parentiter is None: return word = self.treestore.get_value(treeiter, 0) dic = self.treestore.get_value(parentiter, 0) filename = self.conf.get_dic_path(dic) lines = libsl.find_word(word, mode, filename) translate = "<body>%s</body>" % ("".join(lines)) self.__fire_translate_changed(word, translate, newTab) def connect(self, event, callback): self.callbacks[event] = callback def grab_focus(self): self.word_entry.grab_focus() # ================================ Plugin support ============================ def configure(self, window): conf = SlogConf() dlg = gtk.Dialog(plugin_name, window, 0, (gtk.STOCK_OK, gtk.RESPONSE_OK)) hbox = gtk.HBox(False, 8) hbox.set_border_width(8) dlg.vbox.pack_start(hbox, False, False, 0) stock = gtk.image_new_from_stock( gtk.STOCK_DIALOG_QUESTION, gtk.ICON_SIZE_DIALOG) hbox.pack_start(stock, False, False, 0) label = gtk.Label(_("Dictionaries dir:")) hbox.pack_start(label, False, False, 0) dir_entry = gtk.Entry() dir_entry.set_text(conf.sl_dicts_dir) hbox.pack_start(dir_entry, True, True, 0) btn_browse = gtk.Button("...") btn_browse.connect("clicked", self.on_browse_clicked, window, dir_entry) hbox.pack_start(btn_browse, False, False, 0) label.set_mnemonic_widget(dir_entry) dlg.show_all() response = dlg.run() if response == gtk.RESPONSE_OK: ddir = dir_entry.get_text() if not os.path.exists(ddir): ghlp.show_error(window, _("Path not exists!")) conf.sl_dicts_dir = ddir dlg.destroy() def on_browse_clicked(self, widget, window, entry): chooser = gtk.FileChooserDialog("Open..", window, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)) dicts_dir = entry.get_text() if os.path.exists(dicts_dir): chooser.set_current_folder(dicts_dir) response = chooser.run() if response == gtk.RESPONSE_OK: path = chooser.get_filename() entry.set_text(path) chooser.destroy()