# -*- coding: UTF-8 -*- # Gedit External Tools plugin # Copyright (C) 2005-2006 Steve Frécinaux # # 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 __all__ = ('ExternalToolsPlugin', 'OutputPanel', 'Capture', 'UniqueById') from gi.repository import GLib, Gio, GObject, Gtk, Gedit from .library import ToolLibrary from .outputpanel import OutputPanel from .capture import Capture from .functions import * try: import gettext gettext.bindtextdomain('gedit') gettext.textdomain('gedit') _ = gettext.gettext except: _ = lambda s: s class ToolActions(object): def __init__(self, library, window, panel): super(ToolActions, self).__init__() self._library = library self._window = window self._panel = panel self._action_tools = {} self.update() def deactivate(self): self.remove() def remove(self): for name, tool in self._action_tools.items(): self._window.remove_action(name) self._action_tools = {} def _insert_directory(self, directory): 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)) self._action_tools[action_name] = tool action = Gio.SimpleAction(name=action_name) action.connect('activate', capture_menu_action, self._window, self._panel, tool) self._window.add_action(action) def update(self): self.remove() self._insert_directory(self._library.tree) self.filter(self._window.get_active_document()) def filter_language(self, language, item): if not item.languages: return True if not language and 'plain' in item.languages: return True if language and (language.get_id() in item.languages): return True else: return False def filter(self, document): if document is None: titled = False remote = False language = None else: titled = document.get_file().get_location() is not None remote = not document.get_file().is_local() language = document.get_language() states = { 'always': True, 'all': document is not None, 'local': titled and not remote, 'remote': titled and remote, 'titled': titled, 'untitled': not titled, } for name, tool in self._action_tools.items(): action = self._window.lookup_action(name) if action: action.set_enabled(states[tool.applicability] and self.filter_language(language, tool)) class WindowActivatable(GObject.Object, Gedit.WindowActivatable): __gtype_name__ = "ExternalToolsWindowActivatable" window = GObject.Property(type=Gedit.Window) def __init__(self): GObject.Object.__init__(self) self.actions = None def do_activate(self): self.window.external_tools_window_activatable = self self._library = ToolLibrary() # Create output console self._output_buffer = OutputPanel(self.plugin_info.get_data_dir(), self.window) self.actions = ToolActions(self._library, self.window, self._output_buffer) bottom = self.window.get_bottom_panel() bottom.add_titled(self._output_buffer.panel, "GeditExternalToolsShellOutput", _("Tool Output")) def do_update_state(self): if self.actions is not None: self.actions.filter(self.window.get_active_document()) def do_deactivate(self): self.actions.deactivate() bottom = self.window.get_bottom_panel() bottom.remove(self._output_buffer.panel) self.window.external_tools_window_activatable = None def update_actions(self): self.actions.update() # ex:ts=4:et: