summaryrefslogtreecommitdiffstats
path: root/plugins/externaltools/tools/appactivatable.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/externaltools/tools/appactivatable.py')
-rw-r--r--plugins/externaltools/tools/appactivatable.py178
1 files changed, 178 insertions, 0 deletions
diff --git a/plugins/externaltools/tools/appactivatable.py b/plugins/externaltools/tools/appactivatable.py
new file mode 100644
index 0000000..87e1226
--- /dev/null
+++ b/plugins/externaltools/tools/appactivatable.py
@@ -0,0 +1,178 @@
+# -*- coding: UTF-8 -*-
+# Gedit External Tools plugin
+# Copyright (C) 2005-2006 Steve Frécinaux <steve@istique.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from gi.repository import GLib, Gio, GObject, Gtk, Gdk, Gedit
+from .library import ToolLibrary
+from .manager import Manager
+import os
+
+try:
+ import gettext
+ gettext.bindtextdomain('gedit')
+ gettext.textdomain('gedit')
+ _ = gettext.gettext
+except:
+ _ = lambda s: s
+
+class ToolMenu(object):
+ def __init__(self, library, menu):
+ super(ToolMenu, self).__init__()
+ self._library = library
+ self._menu = menu
+ self._action_tools = {}
+
+ self.update()
+
+ def deactivate(self):
+ self.remove()
+
+ def remove(self):
+ self._menu.remove_all()
+
+ for name, tool in self._action_tools.items():
+ if tool.shortcut:
+ app = Gio.Application.get_default()
+ app.remove_accelerator(tool.shortcut)
+
+ def _insert_directory(self, directory, menu):
+ for d in sorted(directory.subdirs, key=lambda x: x.name.lower()):
+ submenu = Gio.Menu()
+ menu.append_submenu(d.name.replace('_', '__'), submenu)
+ section = Gio.Menu()
+ submenu.append_section(None, section)
+
+ self._insert_directory(d, section)
+
+ for tool in sorted(directory.tools, key=lambda x: x.name.lower()):
+ # FIXME: find a better way to share the action name
+ action_name = 'external-tool-%X-%X' % (id(tool), id(tool.name))
+ item = Gio.MenuItem.new(tool.name.replace('_', '__'), "win.%s" % action_name)
+ item.set_attribute_value("hidden-when", GLib.Variant.new_string("action-disabled"))
+ menu.append_item(item)
+
+ if tool.shortcut:
+ app = Gio.Application.get_default()
+ app.add_accelerator(tool.shortcut, "win.%s" % action_name, None)
+
+ def update(self):
+ self.remove()
+ self._insert_directory(self._library.tree, self._menu)
+
+
+# FIXME: restore the launch of the manager on configure using PeasGtk.Configurable
+class AppActivatable(GObject.Object, Gedit.AppActivatable):
+ __gtype_name__ = "ExternalToolsAppActivatable"
+
+ app = GObject.Property(type=Gedit.App)
+
+ def __init__(self):
+ GObject.Object.__init__(self)
+ self.menu = None
+ self._manager = None
+ self._manager_default_size = None
+
+ def do_activate(self):
+ self._library = ToolLibrary()
+ self._library.set_locations(os.path.join(self.plugin_info.get_data_dir(), 'tools'))
+
+ action = Gio.SimpleAction(name="manage-tools")
+ action.connect("activate", lambda action, parameter: self._open_dialog())
+ self.app.add_action(action)
+
+ self.css = Gtk.CssProvider()
+ self.css.load_from_data("""
+.gedit-tool-manager-paned {
+ border-style: solid;
+ border-color: @borders;
+}
+
+.gedit-tool-manager-paned:dir(ltr) {
+ border-width: 0 1px 0 0;
+}
+
+.gedit-tool-manager-paned:dir(rtl) {
+ border-width: 0 0 0 1px;
+}
+
+.gedit-tool-manager-view {
+ border-width: 0 0 1px 0;
+}
+
+.gedit-tool-manager-treeview {
+ border-top-width: 0;
+}
+
+.gedit-tool-manager-treeview:dir(ltr) {
+ border-left-width: 0;
+}
+
+.gedit-tool-manager-treeview:dir(rtl) {
+ border-right-width: 0;
+}
+""".encode('utf-8'))
+
+ Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),
+ self.css, 600)
+
+ self.menu_ext = self.extend_menu("preferences-section")
+ item = Gio.MenuItem.new(_("Manage _External Tools…"), "app.manage-tools")
+ self.menu_ext.append_menu_item(item)
+
+ self.submenu_ext = self.extend_menu("tools-section-1")
+ external_tools_submenu = Gio.Menu()
+ item = Gio.MenuItem.new_submenu(_("External _Tools"), external_tools_submenu)
+ self.submenu_ext.append_menu_item(item)
+ external_tools_submenu_section = Gio.Menu()
+ external_tools_submenu.append_section(None, external_tools_submenu_section)
+
+ self.menu = ToolMenu(self._library, external_tools_submenu_section)
+
+ def do_deactivate(self):
+ self.menu.deactivate()
+ self.menu_ext = None
+ self.submenu_ext = None
+
+ self.app.remove_action("manage-tools")
+
+ Gtk.StyleContext.remove_provider_for_screen(Gdk.Screen.get_default(),
+ self.css)
+
+ def _open_dialog(self):
+ if not self._manager:
+ self._manager = Manager(self.plugin_info.get_data_dir())
+
+ if self._manager_default_size:
+ self._manager.dialog.set_default_size(*self._manager_default_size)
+
+ self._manager.dialog.connect('destroy', self._on_manager_destroy)
+ self._manager.connect('tools-updated', self._on_manager_tools_updated)
+
+ self._manager.run(self.app.get_active_window())
+
+ return self._manager.dialog
+
+ def _on_manager_destroy(self, dialog):
+ self._manager_default_size = self._manager.get_final_size()
+ self._manager = None
+
+ def _on_manager_tools_updated(self, manager):
+ for window in self.app.get_main_windows():
+ window.external_tools_window_activatable.update_actions()
+ self.menu.update()
+
+# ex:ts=4:et: