Пример #1
0
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()
Пример #2
0
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()
Пример #3
0
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()
Пример #4
0
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()
Пример #5
0
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()
Пример #6
0
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()
Пример #7
0
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()