Esempio n. 1
0
    def __init__(self):

        self.callbacks = {}
        self.conf = SlogConf()
        proxy = Proxy(self.conf)
        self.google = GoogleEngine(proxy)

        gladefile = os.path.join(path, "google.glade")
        self.wtree = gtk.glade.XML(gladefile, domain="slog")
        self.wtree.signal_autoconnect({
            "on_btn_clear_clicked":
            self.on_btn_clear_clicked,
            "on_btn_translate_clicked":
            self.on_translate_clicked
        })

        self.vbox = self.wtree.get_widget("vbox1")
        self.vbox.unparent()

        self.textview = self.wtree.get_widget("textview1")

        self.cmb_target = self.wtree.get_widget("combo_targets")
        cell = gtk.CellRendererText()
        self.cmb_target.pack_start(cell, True)
        self.cmb_target.add_attribute(cell, 'text', 0)
        self.model = gtk.ListStore(str, str, str)
        self.cmb_target.set_model(self.model)

        reload_targets(self.google.languages, self.model,
                       self.conf.get_google_targets())
        self.cmb_target.set_active(self.conf.google_target)
Esempio n. 2
0
    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()
Esempio n. 3
0
    def __load(self):
        conf = SlogConf()
        used_dict_list = conf.get_used_dicts()
        spy_file_list = conf.get_spy_dicts()

        dict_list = []
        try:
            dict_list = os.listdir(conf.sl_dicts_dir)
        except OSError, msg:
            print str(msg)
Esempio n. 4
0
	def __load(self):
		conf = SlogConf()
		used_dict_list = conf.get_used_dicts()
		spy_file_list = conf.get_spy_dicts()

		dict_list = []
		try:
			dict_list = os.listdir(conf.sl_dicts_dir)
		except OSError, msg:
			print str(msg)
Esempio n. 5
0
    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)
Esempio n. 6
0
	def __init__(self):
		self.conf = SlogConf()

		gladefile = os.path.join(DATA_DIR, "slog.glade")
		self.wtree = gtk.glade.XML(gladefile, domain="slog")
		self.wtree.signal_autoconnect(self)

		# Create tray icon 
		self.status_icon = gtk.status_icon_new_from_file(get_icon("slog.png"))
		self.status_icon.set_tooltip(APP_NAME)
		self.status_icon.connect("popup-menu", self.on_tray_popup)
		self.status_icon.connect("activate", self.on_tray_clicked)

		# Create main window
		self.window = self.wtree.get_widget("mainWindow")
		self.window.set_icon_from_file(get_icon("slog.png"))
		self.window.set_title("%s %s" % (APP_NAME, VERSION))
		self.window.set_size_request(396, 256)

		# Restore window settings
		(width, height) = self.conf.get_size()
		(left, top) = self.conf.get_pos()
		if left != 0 or top != 0:
			self.window.move(left, top)
		self.window.set_default_size(width, height)

		self.wtree.get_widget("hPaned").set_position(self.conf.paned)
		self.sidebar = self.wtree.get_widget("sideBar")

		#Create Spy object
		self.spy = Spy()
		mb_menuitem_spy = self.wtree.get_widget("menuItemSpy1")
		tray_menuitem_spy = self.wtree.get_widget("menuItemSpy2")
		self.spy_action = gtk.ToggleAction("Spy", "_Spy", "Spy Service", None)
		self.spy_action.connect("activate", self.on_spy_clicked)
		self.spy_action.connect_proxy(tray_menuitem_spy)
		self.spy_action.connect_proxy(mb_menuitem_spy)

		if self.conf.tray_start == 0:
			self.window.show_all()

		if self.conf.spy_auto == 1:
			self.spy_action.activate()

		plugin_dir = os.path.join(DATA_DIR, "plugins")
		self.plugin_manager = PluginManager()
		self.plugin_manager.add_plugin_dir(plugin_dir)
		self.plugin_manager.scan_for_plugins()
		self.plugin_view = PluginView(self.wtree, self.plugin_manager)

		self.__load_plugins()
Esempio n. 7
0
	def __init__(self):

		self.callbacks = {}
		self.conf = SlogConf()
		proxy = Proxy(self.conf)
		self.google = GoogleEngine(proxy)

		gladefile = os.path.join(path, "google.glade")
		self.wtree = gtk.glade.XML(gladefile, domain="slog")
		self.wtree.signal_autoconnect({
				"on_btn_clear_clicked" : self.on_btn_clear_clicked,
				"on_btn_translate_clicked" : self.on_translate_clicked
		})

		self.vbox = self.wtree.get_widget("vbox1")
		self.vbox.unparent()

		self.textview = self.wtree.get_widget("textview1")

		self.cmb_target = self.wtree.get_widget("combo_targets")
		cell = gtk.CellRendererText()
		self.cmb_target.pack_start(cell, True)
		self.cmb_target.add_attribute(cell, 'text', 0)
		self.model = gtk.ListStore(str, str, str)
		self.cmb_target.set_model(self.model)
		
		reload_targets(self.google.languages, self.model, self.conf.get_google_targets())
		self.cmb_target.set_active(self.conf.google_target)
Esempio n. 8
0
class GoogleView(object):

	def __init__(self):

		""" Google View Widget """

		self.callbacks = {}
		self.conf = SlogConf()
		proxy = Proxy(self.conf)
		self.google = GoogleEngine(proxy)

		gladefile = os.path.join(path, "google.glade")
		self.wtree = gtk.glade.XML(gladefile, domain="slog")
		self.wtree.signal_autoconnect({
				"on_btn_clear_clicked" : self.on_btn_clear_clicked,
				"on_btn_translate_clicked" : self.on_translate_clicked
		})

		self.vbox = self.wtree.get_widget("vbox1")
		self.vbox.unparent()

		self.textview = self.wtree.get_widget("textview1")

		self.cmb_target = self.wtree.get_widget("combo_targets")
		cell = gtk.CellRendererText()
		self.cmb_target.pack_start(cell, True)
		self.cmb_target.add_attribute(cell, 'text', 0)
		self.model = gtk.ListStore(str, str, str)
		self.cmb_target.set_model(self.model)

		reload_targets(self.google.languages, self.model, self.conf.get_google_targets())
		self.cmb_target.set_active(self.conf.google_target)

	def __fire_translate_changed(self, translate):

		""" Оповестить обработчики о том, что перевод изменился"""

		callback = self.callbacks["translate_it"]
		if callback is not None:
			callback("Google", translate)

	def __fire_status_changed(self, message, needClear=False):

		""" Оповестить обработчики о том, что статус изменился"""

		callback = self.callbacks["changed"]
		if callback is not None:
			gobject.idle_add(callback, message)
			if needClear:
				gobject.timeout_add(5000, self.__fire_status_changed, "")

	# Thread function
	def request_google(self, src, dst, text):
		try:
			translate = self.google.translate(src, dst, text)
		except urllib2.URLError, err:
			msg = "Google error: %s" % err
			print msg
			self.__fire_status_changed(msg, True)
		else:
Esempio n. 9
0
	def __load_plugins(self):
		for pname in self.plugins.get_available():
			plugin = self.plugins.get_plugin(pname)
			enabled = pname in SlogConf().get_enabled_plugins()

			iter = self.model.append()
			self.model.set(iter, 0, enabled, 1, plugin.plugin_name)
Esempio n. 10
0
    def run(self):
        if not os.path.exists(SL_TMP_DIR):
            os.mkdir(SL_TMP_DIR)

        try:
            import socket
            socket.setdefaulttimeout(5)

            conf = SlogConf()
            proxy = Proxy(conf)
            downloader = proxy.get_ftp_downloader()

            file_dist = os.path.join(SL_TMP_DIR, self.__filename)
            url_dict = FTP_DICTS_URL + "/" + self.__filename
            downloader.retrieve(url_dict, file_dist, self.url_hook_report)

        except IOError, ioerr:
            state = DL_STATE_ERROR
            if self.__cancelled:
                msg = "Download cancelled!"
                state = DL_STATE_CANCEL
            else:
                t = ioerr.strerror
                msg = "Network error while trying to get url: %s\n%s" % (
                    url_dict, t)

            self.__finish(state, msg)
            return
Esempio n. 11
0
	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()
Esempio n. 12
0
    def __init__(self, filename, event, name="DictInstaller"):
        threading.Thread.__init__(self, name=name)

        self.__filename = filename
        self.__event = event
        self.__cancelled = False
        self.__callbacks = []
        self.conf = SlogConf()
Esempio n. 13
0
    def __init__(self, parent, plugins):

        self.__plugins = plugins

        gladefile = os.path.join(DATA_DIR, "slog.glade")
        self.wtree = gtk.glade.XML(gladefile, "prefDialog", domain="slog")
        self.wtree.signal_autoconnect(self)
        self.dialog = self.wtree.get_widget("prefDialog")
        self.dialog.set_transient_for(parent)

        self.conf = SlogConf()

        # Creating combobox for modifer keys
        model = gtk.ListStore(str)
        model.append(["Ctrl"])
        model.append(["Alt"])
        model.append(["Shift"])
        model.append(["Win"])
        model.append(["None"])

        combo_keys = self.wtree.get_widget("comboKeys")
        cell = gtk.CellRendererText()
        combo_keys.pack_start(cell, True)
        combo_keys.add_attribute(cell, "text", 0)
        combo_keys.set_model(model)
        combo_keys.set_active(self.conf.mod_key)

        self.entry_proxy_host = self.wtree.get_widget("entryProxyHost")
        self.entry_proxy_host.set_text(self.conf.proxy_host)
        self.entry_proxy_port = self.wtree.get_widget("entryProxyPort")
        self.entry_proxy_port.set_value(self.conf.proxy_port)

        self.__setup_checkbox("chkSpyAutoStart", self.conf.spy_auto)
        self.__setup_checkbox("chkTrayExit", self.conf.tray_exit)
        self.__setup_checkbox("chkTrayInfo", self.conf.tray_info)
        self.__setup_checkbox("chkTrayStart", self.conf.tray_start)
        self.__setup_checkbox("chkProxyServer", self.conf.proxy)

        self.plugins_model = gtk.ListStore(bool, str)
        treeview = self.wtree.get_widget("tablePlugins")
        treeview.set_model(self.plugins_model)

        renderer = gtk.CellRendererToggle()
        renderer.connect('toggled', self.on_item_toggled, self.plugins_model)
        column = gtk.TreeViewColumn(_("Enabled"), renderer, active=0)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
        column.set_fixed_width(64)
        treeview.append_column(column)

        column = gtk.TreeViewColumn(_("Name"), gtk.CellRendererText(), text=1)
        treeview.append_column(column)

        self.__selection = treeview.get_selection()
        self.__selection.connect("changed", self.on_plugin_clicked)

        gobject.idle_add(self.__load_plugins)
Esempio n. 14
0
class GoogleView(object):
    def __init__(self):

        self.callbacks = {}
        self.conf = SlogConf()
        proxy = Proxy(self.conf)
        self.google = GoogleEngine(proxy)

        gladefile = os.path.join(path, "google.glade")
        self.wtree = gtk.glade.XML(gladefile, domain="slog")
        self.wtree.signal_autoconnect({
            "on_btn_clear_clicked":
            self.on_btn_clear_clicked,
            "on_btn_translate_clicked":
            self.on_translate_clicked
        })

        self.vbox = self.wtree.get_widget("vbox1")
        self.vbox.unparent()

        self.textview = self.wtree.get_widget("textview1")

        self.cmb_target = self.wtree.get_widget("combo_targets")
        cell = gtk.CellRendererText()
        self.cmb_target.pack_start(cell, True)
        self.cmb_target.add_attribute(cell, 'text', 0)
        self.model = gtk.ListStore(str, str, str)
        self.cmb_target.set_model(self.model)

        reload_targets(self.google.languages, self.model,
                       self.conf.get_google_targets())
        self.cmb_target.set_active(self.conf.google_target)

    def __fire_translate_changed(self, translate):
        callback = self.callbacks["translate_it"]
        if callback is not None:
            callback("Google", translate)

    def __fire_status_changed(self, message, needClear=False):
        callback = self.callbacks["changed"]
        if callback is not None:
            gobject.idle_add(callback, message)
            if needClear:
                gobject.timeout_add(5000, self.__fire_status_changed, "")

    # Thread function
    def request_google(self, src, dst, text):
        try:
            translate = self.google.translate(src, dst, text)
        except urllib2.URLError, err:
            msg = "Google error: %s" % err
            print msg
            self.__fire_status_changed(msg, True)
        else:
Esempio n. 15
0
    def download_repo_file(self, event):
        try:
            import socket
            socket.setdefaulttimeout(5)

            conf = SlogConf()
            proxy = Proxy(conf)
            downloader = proxy.get_ftp_downloader()
            downloader.retrieve(FTP_REPO_URL, REPO_FILE)

        except IOError, e:
            print str(e)
Esempio n. 16
0
	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)
Esempio n. 17
0
	def __init__(self):
		self.conf = SlogConf()

		gladefile = os.path.join(DATA_DIR, "slog.glade")
		self.wtree = gtk.glade.XML(gladefile, domain="slog")
		self.wtree.signal_autoconnect(self)

		# Create tray icon 
		self.status_icon = gtk.status_icon_new_from_file(get_icon("slog.png"))
		self.status_icon.set_tooltip(APP_NAME)
		self.status_icon.connect("popup-menu", self.on_tray_popup)
		self.status_icon.connect("activate", self.on_tray_clicked)

		# Create main window
		self.window = self.wtree.get_widget("mainWindow")
		self.window.set_icon_from_file(get_icon("slog_logo.png"))
		self.window.set_title("%s %s" % (APP_NAME, VERSION))
		self.window.set_size_request(396, 256)

		# Restore window settings
		(width, height) = self.conf.get_size()
		(left, top) = self.conf.get_pos()
		if left != 0 or top != 0:
			self.window.move(left, top)
		self.window.set_default_size(width, height)

		self.wtree.get_widget("hPaned").set_position(self.conf.paned)
		self.sidebar = self.wtree.get_widget("sideBar")

		#Create Spy object
		self.spy = Spy()
		mb_menuitem_spy = self.wtree.get_widget("menuItemSpy1")
		tray_menuitem_spy = self.wtree.get_widget("menuItemSpy2")
		self.spy_action = gtk.ToggleAction("Spy", "_Spy", "Spy Service", None)
		self.spy_action.connect("activate", self.on_spy_clicked)
		self.spy_action.connect_proxy(tray_menuitem_spy)
		self.spy_action.connect_proxy(mb_menuitem_spy)

		if self.conf.tray_start == 0:
			self.window.show_all()

		if self.conf.spy_auto == 1:
			self.spy_action.activate()

		plugin_dir = os.path.join(DATA_DIR, "plugins")
		self.plugin_manager = PluginManager()
		self.plugin_manager.add_plugin_dir(plugin_dir)
		self.plugin_manager.scan_for_plugins()
		self.plugin_view = PluginView(self.wtree, self.plugin_manager)

		self.__load_plugins()
Esempio n. 18
0
    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()
Esempio n. 19
0
	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()
Esempio n. 20
0
	def __init__(self, parent, plugins):
		gtk.Dialog.__init__(self, _("Preferences"), parent,
								gtk.DIALOG_MODAL, (gtk.STOCK_CLOSE, gtk.RESPONSE_OK))

		self.conf = SlogConf()

		notebook = gtk.Notebook()
		self.vbox.pack_start(notebook, True, True, 0)

		main_page = self.__create_main_page()
		notebook.append_page(main_page, gtk.Label(_("Main")))
		main_page.show()

		plugins_page = PluginsView(self, plugins)
		notebook.append_page(plugins_page, gtk.Label(_("Plugins")))
		plugins_page.show()

		notebook.show()
Esempio n. 21
0
	def __init__(self):
		gtk.VBox.__init__(self, False, 0)

		self.callbacks = {}
		self.google = GoogleEngine()
		self.conf = SlogConf()

		tooltips = gtk.Tooltips()
		hbox = gtk.HBox(False, 4)
		hbox.set_border_width(4)
		self.pack_start(hbox, False, False, 0)

		self.cmb_target = gtk.combo_box_new_text()

		for target in self.google.get_targets():
			self.cmb_target.append_text(target)
		self.cmb_target.set_active(self.conf.google_target)

		hbox.pack_start(self.cmb_target, True, True, 0)

		btn_clear = ghlp.create_speed_button(gtk.STOCK_CLEAR)
		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.textview = gtk.TextView()
		self.textview.set_wrap_mode(gtk.WRAP_WORD)
		sw.add(self.textview)

		btn_translate = gtk.Button(_("Translate"))
		btn_translate.set_border_width(4)
		btn_translate.connect("clicked", self.on_translate_clicked)
		self.pack_start(btn_translate, False, True, 0)
Esempio n. 22
0
    def __init__(self, parent):
        gtk.Dialog.__init__(self, _("Manage dictionaries"), parent,
                            gtk.DIALOG_DESTROY_WITH_PARENT,
                            (gtk.STOCK_CLOSE, gtk.RESPONSE_OK))

        self.tooltips = gtk.Tooltips()
        hbox = gtk.HBox(False, 0)
        self.vbox.pack_start(hbox, True, True, 0)

        frame_left = gtk.Frame(_(" Available "))
        frame_left.set_border_width(4)
        frame_right = gtk.Frame(_(" Installed "))
        frame_right.set_border_width(4)

        hbox_left = gtk.HBox(False, 4)
        hbox_left.set_border_width(4)
        hbox_right = gtk.HBox(False, 4)
        hbox_right.set_border_width(4)

        self.list_avail = AvailDataModel()
        sw1, tree_avail = self.__create_treeview(self.list_avail)
        avail_selection = tree_avail.get_selection()

        cell = gtk.CellRendererText()
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
        column = gtk.TreeViewColumn(_("Name"), cell, text=COL_A_NAME)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
        column.set_expand(True)
        column.set_resizable(True)
        column.set_sort_column_id(COL_A_NAME)
        column.set_reorderable(True)
        tree_avail.append_column(column)

        column = gtk.TreeViewColumn(_("Target"),
                                    gtk.CellRendererText(),
                                    text=COL_A_TARGET)
        column.set_sort_column_id(COL_A_TARGET)
        column.set_reorderable(True)
        tree_avail.append_column(column)

        column = gtk.TreeViewColumn(_("Size"),
                                    gtk.CellRendererText(),
                                    text=COL_A_SIZE)
        column.set_sort_column_id(COL_A_SIZE)
        column.set_reorderable(True)
        tree_avail.append_column(column)
        #self.list_avail.set_sort_column_id(COL_A_TARGET, gtk.SORT_ASCENDING)

        self.list_inst = InstDataModel()
        sw2, tree_inst = self.__create_treeview(self.list_inst)
        inst_selection = tree_inst.get_selection()

        renderer = gtk.CellRendererToggle()
        renderer.connect('toggled', self.on_item_toggled, self.list_inst)
        renderer.set_data("column", COL_I_USED)
        column = gtk.TreeViewColumn(_("Used"), renderer, active=COL_I_USED)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
        column.set_fixed_width(64)
        tree_inst.append_column(column)

        renderer = gtk.CellRendererToggle()
        renderer.connect('toggled', self.on_item_toggled, self.list_inst)
        renderer.set_data("column", COL_I_SPY)
        column = gtk.TreeViewColumn(_("Spy"), renderer, active=COL_I_SPY)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
        column.set_fixed_width(64)
        tree_inst.append_column(column)

        cell = gtk.CellRendererText()
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
        column = gtk.TreeViewColumn(_("Name"), cell, text=COL_I_NAME)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
        column.set_expand(True)
        column.set_resizable(True)
        column.set_sort_column_id(COL_I_NAME)
        column.set_reorderable(True)
        tree_inst.append_column(column)
        column = gtk.TreeViewColumn(_("Target"),
                                    gtk.CellRendererText(),
                                    text=COL_I_TARGET)
        column.set_sort_column_id(COL_I_TARGET)
        column.set_reorderable(True)
        tree_inst.append_column(column)

        btn_fresh = self.__create_button(gtk.STOCK_REFRESH, _("Refresh"))
        btn_fresh.connect("clicked", self.on_btn_fresh_clicked)
        btn_right = self.__create_button(gtk.STOCK_GO_FORWARD, _("Add"))
        btn_right.connect("clicked", self.on_btn_right_clicked,
                          avail_selection)
        btn_left = self.__create_button(gtk.STOCK_GO_BACK, _("Remove"))
        btn_left.connect("clicked", self.on_btn_left_clicked, inst_selection)
        btn_up = self.__create_button(gtk.STOCK_GO_UP, _("Up"))
        btn_up.connect("clicked", self.on_btn_up_clicked, inst_selection)
        btn_down = self.__create_button(gtk.STOCK_GO_DOWN, _("Down"))
        btn_down.connect("clicked", self.on_btn_down_clicked, inst_selection)

        vbox_left, vbox_1 = self.__create_bbox()
        vbox_right, vbox_2 = self.__create_bbox()

        vbox_1.pack_start(btn_fresh, False, False, 0)
        vbox_1.pack_start(btn_right, False, False, 0)
        vbox_2.pack_start(btn_up, False, False, 0)
        vbox_2.pack_start(btn_left, False, False, 0)
        vbox_2.pack_start(btn_down, False, False, 0)

        hbox_left.pack_start(sw1, True, True, 0)
        hbox_left.pack_start(vbox_left, False, False, 0)

        hbox_right.pack_start(vbox_right, False, False, 0)
        hbox_right.pack_start(sw2, True, True, 0)

        frame_left.add(hbox_left)
        frame_right.add(hbox_right)

        hbox.pack_start(frame_left, True, True, 0)
        hbox.pack_start(frame_right, True, True, 0)
        hbox.show_all()

        self.conf = SlogConf()
Esempio n. 23
0
    def __init__(self, parent):

        gladefile = os.path.join(DATA_DIR, "slog.glade")
        self.wtree = gtk.glade.XML(gladefile, "dictsDialog", domain="slog")
        self.wtree.signal_autoconnect(self)
        self.dialog = self.wtree.get_widget("dictsDialog")

        self.conf = SlogConf()

        self.list_avail = AvailDataModel()
        #self.avail_filter = self.list_avail.filter_new()

        tree_avail = self.wtree.get_widget("tableAvailDicts")
        tree_avail.set_model(self.list_avail)
        self.__avail_selection = tree_avail.get_selection()

        cell = gtk.CellRendererText()
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
        column = gtk.TreeViewColumn(_("Name"), cell, text=COL_A_NAME)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
        column.set_expand(True)
        column.set_resizable(True)
        column.set_sort_column_id(COL_A_NAME)
        column.set_reorderable(True)
        tree_avail.append_column(column)

        column = gtk.TreeViewColumn(_("Target"),
                                    gtk.CellRendererText(),
                                    text=COL_A_TARGET)
        column.set_sort_column_id(COL_A_TARGET)
        column.set_reorderable(True)
        tree_avail.append_column(column)

        column = gtk.TreeViewColumn(_("Size"),
                                    gtk.CellRendererText(),
                                    text=COL_A_SIZE)
        column.set_sort_column_id(COL_A_SIZE)
        column.set_reorderable(True)
        tree_avail.append_column(column)
        self.list_avail.set_sort_column_id(COL_A_TARGET, gtk.SORT_ASCENDING)

        self.list_inst = InstDataModel()
        self.list_inst.connect("row-changed", self.on_row_changed)
        self.list_inst.connect("row-inserted", self.on_row_inserted)
        tree_inst = self.wtree.get_widget("tableInstDicts")
        tree_inst.set_model(self.list_inst)
        self.__inst_selection = tree_inst.get_selection()

        renderer = gtk.CellRendererToggle()
        renderer.connect('toggled', self.on_item_toggled, self.list_inst)
        renderer.set_data("column", COL_I_USED)
        column = gtk.TreeViewColumn(_("Used"), renderer, active=COL_I_USED)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
        column.set_fixed_width(64)
        tree_inst.append_column(column)

        renderer = gtk.CellRendererToggle()
        renderer.connect('toggled', self.on_item_toggled, self.list_inst)
        renderer.set_data("column", COL_I_SPY)
        column = gtk.TreeViewColumn(_("Spy"), renderer, active=COL_I_SPY)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
        column.set_fixed_width(64)
        tree_inst.append_column(column)

        cell = gtk.CellRendererText()
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
        column = gtk.TreeViewColumn(_("Name"), cell, text=COL_I_NAME)
        column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
        column.set_expand(True)
        column.set_resizable(True)
        column.set_sort_column_id(COL_I_NAME)
        column.set_reorderable(True)
        tree_inst.append_column(column)

        column = gtk.TreeViewColumn(_("Target"),
                                    gtk.CellRendererText(),
                                    text=COL_I_TARGET)
        column.set_sort_column_id(COL_I_TARGET)
        column.set_reorderable(True)
        tree_inst.append_column(column)
Esempio n. 24
0
class MainWindow(object):

	def __init__(self):
		self.conf = SlogConf()

		gladefile = os.path.join(DATA_DIR, "slog.glade")
		self.wtree = gtk.glade.XML(gladefile, domain="slog")
		self.wtree.signal_autoconnect(self)

		# Create tray icon 
		self.status_icon = gtk.status_icon_new_from_file(get_icon("slog.png"))
		self.status_icon.set_tooltip(APP_NAME)
		self.status_icon.connect("popup-menu", self.on_tray_popup)
		self.status_icon.connect("activate", self.on_tray_clicked)

		# Create main window
		self.window = self.wtree.get_widget("mainWindow")
		self.window.set_icon_from_file(get_icon("slog.png"))
		self.window.set_title("%s %s" % (APP_NAME, VERSION))
		self.window.set_size_request(396, 256)

		# Restore window settings
		(width, height) = self.conf.get_size()
		(left, top) = self.conf.get_pos()
		if left != 0 or top != 0:
			self.window.move(left, top)
		self.window.set_default_size(width, height)

		self.wtree.get_widget("hPaned").set_position(self.conf.paned)
		self.sidebar = self.wtree.get_widget("sideBar")

		#Create Spy object
		self.spy = Spy()
		mb_menuitem_spy = self.wtree.get_widget("menuItemSpy1")
		tray_menuitem_spy = self.wtree.get_widget("menuItemSpy2")
		self.spy_action = gtk.ToggleAction("Spy", "_Spy", "Spy Service", None)
		self.spy_action.connect("activate", self.on_spy_clicked)
		self.spy_action.connect_proxy(tray_menuitem_spy)
		self.spy_action.connect_proxy(mb_menuitem_spy)

		if self.conf.tray_start == 0:
			self.window.show_all()

		if self.conf.spy_auto == 1:
			self.spy_action.activate()

		plugin_dir = os.path.join(DATA_DIR, "plugins")
		self.plugin_manager = PluginManager()
		self.plugin_manager.add_plugin_dir(plugin_dir)
		self.plugin_manager.scan_for_plugins()
		self.plugin_view = PluginView(self.wtree, self.plugin_manager)

		self.__load_plugins()

	def __load_plugins(self):

		list_enabled = self.conf.get_enabled_plugins()
		if list_enabled == []:
			return

		self.sidebar.remove_page(0)
		for plugin in self.plugin_manager.get_available():
			if plugin not in list_enabled:
				continue

			self.plugin_manager.enable_plugin(plugin)
			
			while gtk.events_pending():
				gtk.main_iteration(False)

		self.plugin_view.set_active(self.conf.get_engine())

	def __create_notify(self, title, message, timeout=3000):
		n = pynotify.Notification(title, message)
		n.attach_to_status_icon(self.status_icon)
		n.set_urgency(pynotify.URGENCY_NORMAL)
		n.set_timeout(timeout)
		n.set_icon_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(get_icon("slog.png"), 48, 48))
		return n

	#################
	# GUI Callbacks #
	#################

	def on_window_closed(self, widget, data=None):
		if self.conf.tray_exit != 0:
			self.window.destroy(widget, data)

		if self.conf.tray_info != 0:
			n = self.__create_notify(APP_NAME, "Close in system tray")
			if not n.show():
				print "Failed to send notification"

		self.window.hide()
		return True

	def on_window_exit(self, widget, data=None):
		(width, height) = self.window.get_size()
		(left, top) = self.window.get_position()
		self.conf.paned = self.wtree.get_widget("hPaned").get_position()
		self.conf.set_size(width, height)
		self.conf.set_pos(left, top)
		self.conf.set_engine(self.plugin_view.get_active())
		self.conf.save()
		gtk.main_quit()

	def on_spy_clicked(self, widget):
		if widget.get_active():
			self.status_icon.set_from_file(get_icon("slog_spy.png"))
			self.spy.start()
		else:
			self.status_icon.set_from_file(get_icon("slog.png"))
			self.spy.stop()

	def on_preferences_activate(self, widget, data=None):
		dialog = PrefsDialog(self.window, self.plugin_manager)
		dialog.run()
		dialog.destroy()

	def on_dicts_manage_activate(self, widget, data=None):
		dialog = DictsDialog(self.window)
		dialog.run()
		dialog.destroy()

	def on_about_activate(self, action):
		dialog = gtk.AboutDialog()
		dialog.set_name(APP_NAME)
		dialog.set_logo(gtk.gdk.pixbuf_new_from_file(get_icon("slog.png")))
		dialog.set_copyright("\302\251 Copyright 2007,2008 Renat Nasyrov ([email protected])")
		dialog.set_website(WEBSITE)
		dialog.set_version(VERSION)
		dialog.set_license(LICENSE)
		dialog.connect ("response", lambda d, r: d.destroy())
		dialog.show()

	def on_tray_clicked(self, args):
		self.window_toggle()

	def on_tray_popup(self, icon, event_button, event_time):
		tray_menu = self.wtree.get_widget("trayMenu")
		tray_menu.popup(None, None, gtk.status_icon_position_menu, event_button, event_time, self.status_icon)

	###########
	# Private #
	###########

	def window_toggle(self):
		if self.window.get_property("visible"):
			self.window.hide()
		else:
			self.window.show_all()
			gobject.idle_add(self.window_present_and_focus)

	def window_present_and_focus(self):
		self.window.present()
		self.window.grab_focus()

	def run(self):
		self.ipc = SLogDBus(self)
		if not pynotify.init("SLog Notification"):
			print "Failed init python-notify module"

		gobject.threads_init()
		gtk.gdk.threads_enter()
		gtk.main()
		gtk.gdk.threads_leave()
Esempio n. 25
0
File: spy.py Progetto: mdevaev/slog
	def __init__(self):
		self.timer = 0;
		self.prev_selection = ""
		self.clipboard = gtk.clipboard_get(gdk.SELECTION_PRIMARY)
		self.conf = SlogConf()
		self.spy_view = None
Esempio n. 26
0
File: spy.py Progetto: mdevaev/slog
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()
Esempio n. 27
0
	def __init__(self):
		self.timer = 0;
		self.prev_selection = ""
		self.clipboard = gtk.clipboard_get(gdk.SELECTION_PRIMARY)
		self.conf = SlogConf()
		self.spy_view = None
Esempio n. 28
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()
Esempio n. 29
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()
Esempio n. 30
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()
Esempio n. 31
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()
Esempio n. 32
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()
Esempio n. 33
0
class MainWindow(object):

	def __init__(self):
		self.conf = SlogConf()

		gladefile = os.path.join(DATA_DIR, "slog.glade")
		self.wtree = gtk.glade.XML(gladefile, domain="slog")
		self.wtree.signal_autoconnect(self)

		# Create tray icon 
		self.status_icon = gtk.status_icon_new_from_file(get_icon("slog.png"))
		self.status_icon.set_tooltip(APP_NAME)
		self.status_icon.connect("popup-menu", self.on_tray_popup)
		self.status_icon.connect("activate", self.on_tray_clicked)

		# Create main window
		self.window = self.wtree.get_widget("mainWindow")
		self.window.set_icon_from_file(get_icon("slog_logo.png"))
		self.window.set_title("%s %s" % (APP_NAME, VERSION))
		self.window.set_size_request(396, 256)

		# Restore window settings
		(width, height) = self.conf.get_size()
		(left, top) = self.conf.get_pos()
		if left != 0 or top != 0:
			self.window.move(left, top)
		self.window.set_default_size(width, height)

		self.wtree.get_widget("hPaned").set_position(self.conf.paned)
		self.sidebar = self.wtree.get_widget("sideBar")

		#Create Spy object
		self.spy = Spy()
		mb_menuitem_spy = self.wtree.get_widget("menuItemSpy1")
		tray_menuitem_spy = self.wtree.get_widget("menuItemSpy2")
		self.spy_action = gtk.ToggleAction("Spy", "_Spy", "Spy Service", None)
		self.spy_action.connect("activate", self.on_spy_clicked)
		self.spy_action.connect_proxy(tray_menuitem_spy)
		self.spy_action.connect_proxy(mb_menuitem_spy)

		if self.conf.tray_start == 0:
			self.window.show_all()

		if self.conf.spy_auto == 1:
			self.spy_action.activate()

		plugin_dir = os.path.join(DATA_DIR, "plugins")
		self.plugin_manager = PluginManager()
		self.plugin_manager.add_plugin_dir(plugin_dir)
		self.plugin_manager.scan_for_plugins()
		self.plugin_view = PluginView(self.wtree, self.plugin_manager)

		self.__load_plugins()

	def __load_plugins(self):

		list_enabled = self.conf.get_enabled_plugins()
		if list_enabled == []:
			return

		self.sidebar.remove_page(0)
		for plugin in self.plugin_manager.get_available():
			if plugin not in list_enabled:
				continue

			self.plugin_manager.enable_plugin(plugin)
			
			while gtk.events_pending():
				gtk.main_iteration(False)

		self.plugin_view.set_active(self.conf.get_engine())

	def __create_notify(self, title, message, timeout=3000):
		n = pynotify.Notification(title, message)
		n.attach_to_status_icon(self.status_icon)
		n.set_urgency(pynotify.URGENCY_NORMAL)
		n.set_timeout(timeout)
		n.set_icon_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(get_icon("slog.png"), 48, 48))
		return n

	#################
	# GUI Callbacks #
	#################

	def on_window_closed(self, widget, data=None):
		if self.conf.tray_exit != 0:
			self.window.destroy(widget, data)

		if self.conf.tray_info != 0:
			n = self.__create_notify(APP_NAME, "Closed to system tray")
			if not n.show():
				print "Warning: Failed to show notification"

		self.window.hide()
		return True

	def on_window_exit(self, widget, data=None):
		(width, height) = self.window.get_size()
		(left, top) = self.window.get_position()
		self.conf.paned = self.wtree.get_widget("hPaned").get_position()
		self.conf.set_size(width, height)
		self.conf.set_pos(left, top)
		self.conf.set_engine(self.plugin_view.get_active_engine())
		self.conf.save()
		gtk.main_quit()

	def on_spy_clicked(self, widget):
		if widget.get_active():
			self.status_icon.set_from_file(get_icon("slog_spy.png"))
			self.spy.start()
		else:
			self.status_icon.set_from_file(get_icon("slog.png"))
			self.spy.stop()

	def on_preferences_activate(self, widget, data=None):
		dialog = PrefsDialog(self.window, self.plugin_manager)
		dialog.run()
		dialog.destroy()

	def on_dicts_manage_activate(self, widget, data=None):
		dialog = DictsDialog(self.window)
		dialog.run()
		dialog.destroy()

	def on_about_activate(self, action):
		dialog = gtk.AboutDialog()
		dialog.set_name(APP_NAME)
		dialog.set_logo(gtk.gdk.pixbuf_new_from_file(get_icon("slog_logo.png")))
		dialog.set_copyright("\302\251 Copyright 2007-2009, Renat Nasyrov ([email protected])")
		dialog.set_website(WEBSITE)
		dialog.set_version(VERSION)
		dialog.set_license(LICENSE)
		dialog.connect("response", lambda d, r: d.destroy())
		dialog.show()

	def on_tray_clicked(self, args):
		self.window_toggle()

	def on_tray_popup(self, icon, event_button, event_time):
		tray_menu = self.wtree.get_widget("trayMenu")
		tray_menu.popup(None, None, gtk.status_icon_position_menu, event_button, event_time, self.status_icon)

	###########
	# Private #
	###########

	def window_toggle(self):
		if self.window.get_property("visible"):
			self.window.hide()
		else:
			self.window.show_all()
			gobject.idle_add(self.window_present_and_focus)

	def window_present_and_focus(self):
		self.window.present()
		self.window.grab_focus()

	def run(self):
		self.ipc = SLogDBus(self)
		if not pynotify.init("SLog Notification"):
			print "Failed init python-notify module"

		gobject.threads_init()
		gtk.gdk.threads_enter()
		gtk.main()
		gtk.gdk.threads_leave()
Esempio n. 34
0
 def __init__(self):
     gtk.ListStore.__init__(self, bool, bool, str, str)
     self.conf = SlogConf()
     self.__load()
Esempio n. 35
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()
Esempio n. 36
0
 def __init__(self):
     self.plugins = {}
     self.enabled_plugins = {}
     self.conf = SlogConf()