Source code for pyface.tasks.i_editor_area_pane

# (C) Copyright 2005-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!

import logging


from traits.api import (
    Bool,
    Callable,
    Dict,
    Event,
    File,
    HasTraits,
    Instance,
    List,
    Str,
)


from pyface.tasks.i_editor import IEditor
from pyface.tasks.i_task_pane import ITaskPane

# Logger.
logger = logging.getLogger(__name__)


[docs]class IEditorAreaPane(ITaskPane): """ A central pane that contains tabbed editors. There are currently two implementations of this interface in Tasks. EditorAreaPane provides a simple, tabbed editor area. AdvancedEditorAreaPane additionally permits arbitrary splitting of the editor area so that editors can be displayed side-by-side. """ # 'IEditorAreaPane' interface -----------------------------------------# #: The currently active editor. active_editor = Instance(IEditor) #: The list of all the visible editors in the pane. editors = List(IEditor) #: A list of extensions for file types to accept via drag and drop. #: Note: This functionality is provided because it is very common, but #: drag and drop support is in general highly toolkit-specific. If more #: sophisticated support is required, subclass an editor area #: implementation. file_drop_extensions = List(Str) #: A file with a supported extension was dropped into the editor area. file_dropped = Event(File) #: Whether to hide the tab bar when there is only a single editor. hide_tab_bar = Bool(False) # ------------------------------------------------------------------------ # 'IEditorAreaPane' interface. # ------------------------------------------------------------------------
[docs] def activate_editor(self, editor): """ Activates the specified editor in the pane. """
[docs] def add_editor(self, editor): """ Adds an editor to the pane. """
[docs] def create_editor(self, obj, factory=None): """ Creates an editor for an object. If a factory is specified, it will be used instead of the editor factory registry. Otherwise, this method will return None if a suitable factory cannot be found in the registry. Note that the editor is not added to the pane. """
[docs] def edit(self, obj, factory=None, use_existing=True): """ Edit an object. This is a convenience method that creates and adds an editor for the specified object. If 'use_existing' is set and the object is already being edited, then that editor will be activated and a new editor will not be created. Returns the (possibly new) editor for the object. """
[docs] def get_editor(self, obj): """ Returns the editor for an object. Returns None if the object is not being edited. """
[docs] def get_factory(self, obj): """ Returns an editor factory suitable for editing an object. Returns None if there is no such editor factory. """
[docs] def register_factory(self, factory, filter): """ Registers a factory for creating editors. The 'factory' parameter is a callabe of form: callable(editor_area=editor_area, obj=obj) -> IEditor Often, factory will be a class that provides the 'IEditor' interface. The 'filter' parameter is a callable of form: callable(obj) -> bool that indicates whether the editor factory is suitable for an object. If multiple factories apply to a single object, it is undefined which factory is used. On the other hand, multiple filters may be registered for a single factory, in which case only one must apply for the factory to be selected. """
[docs] def remove_editor(self, editor): """ Removes an editor from the pane. """
[docs] def unregister_factory(self, factory): """ Unregisters a factory for creating editors. """
[docs]class MEditorAreaPane(HasTraits): # 'IEditorAreaPane' interface -----------------------------------------# active_editor = Instance(IEditor) editors = List(IEditor) file_drop_extensions = List(Str) file_dropped = Event(File) hide_tab_bar = Bool(False) # Protected traits ----------------------------------------------------- _factory_map = Dict(Callable, List(Callable)) # ------------------------------------------------------------------------ # 'IEditorAreaPane' interface. # ------------------------------------------------------------------------
[docs] def create_editor(self, obj, factory=None): """ Creates an editor for an object. """ if factory is None: factory = self.get_factory(obj) if factory is not None: return factory(editor_area=self, obj=obj) return None
[docs] def edit(self, obj, factory=None, use_existing=True): """ Edit an object. """ if use_existing: # Is the object already being edited in the window? editor = self.get_editor(obj) if editor is not None: self.activate_editor(editor) return editor # If not, create an editor for it. editor = self.create_editor(obj, factory) if editor is None: logger.warning("Cannot create editor for obj %r", obj) else: self.add_editor(editor) self.activate_editor(editor) return editor
[docs] def get_editor(self, obj): """ Returns the editor for an object. """ for editor in self.editors: if editor.obj == obj: return editor return None
[docs] def get_factory(self, obj): """ Returns an editor factory suitable for editing an object. """ for factory, filters in self._factory_map.items(): for filter_ in filters: # FIXME: We should swallow exceptions, but silently? try: if filter_(obj): return factory except: pass return None
[docs] def register_factory(self, factory, filter): """ Registers a factory for creating editors. """ self._factory_map.setdefault(factory, []).append(filter)
[docs] def unregister_factory(self, factory): """ Unregisters a factory for creating editors. """ if factory in self._factory_map: del self._factory_map[factory]