34 from python_qt_binding.QtCore 
import \
 
   35     qCritical, qDebug, QObject, Qt, qWarning, Signal, Slot
 
   48     Manager of plugin life cycle. 
   50     It creates a specific `PluginHandler` for each plugin instance and maintains the perspective 
   51     specific set of running plugins. 
   54     plugins_about_to_change_signal = Signal()
 
   55     plugins_changed_signal = Signal()
 
   56     plugin_help_signal = Signal(object)
 
   57     save_settings_completed_signal = Signal()
 
   58     close_application_signal = Signal()
 
   59     _deferred_reload_plugin_signal = Signal(str)
 
   61     discovery_cache_max_age = 60 * 60 * 24  
 
   63     def __init__(self, plugin_provider, settings, application_context, settings_prefix=''):
 
   64         super(PluginManager, self).
__init__()
 
   65         self.setObjectName(
'PluginManager')
 
   69             [x 
for x 
in [
'plugin_manager', settings_prefix] 
if x != 
'']))
 
   89                 qCritical(
'PluginManager.__init__() multiprocess-mode only available under linux')
 
  105         if menu_bar 
is not None:
 
  121         for plugin_descriptor 
in plugin_descriptors:
 
  134         discovery_data = self.
_settings.get_settings(
'discovery_data')
 
  136         cache_stamp = self.
_settings.value(
'discovery_timestamp', default_value=
None)
 
  138             cache_stamp = float(cache_stamp)
 
  144                 cache_stamp > now 
or \
 
  145                 cache_stamp + PluginManager.discovery_cache_max_age < now:
 
  146             qDebug(
'PluginManager._discover() force discovery of plugins')
 
  148             for k 
in discovery_data.all_keys():
 
  149                 discovery_data.remove(k)
 
  151             qDebug(
'PluginManager._discover() using cached plugin discovery information')
 
  157             self.
_settings.set_value(
'discovery_timestamp', now)
 
  159         return plugin_descriptors
 
  163         for plugin_id, plugin_full_name 
in self.
get_plugins().items():
 
  164             if plugin_full_name.lower().find(lookup_name.lower()) >= 0 
or \
 
  165                     plugin_id.lower().find(lookup_name.lower()) >= 0:
 
  166                 plugins[plugin_id] = plugin_full_name
 
  173             plugins[plugin_id] = 
'/'.join(
 
  174                 plugin_descriptor.attributes().get(
'class_type', 
'unknown').split(
'::'))
 
  187         qDebug(
'PluginManager.load_plugin(%s, %s)' %
 
  188                (str(plugin_id), str(serial_number) 
if serial_number 
is not None else ''))
 
  191         if serial_number 
is None:
 
  198         plugin_id = str(plugin_id)
 
  200         used_serial_numbers = {}
 
  202             if info[
'instance_id'].plugin_id == plugin_id:
 
  203                 used_serial_numbers[info[
'instance_id'].serial_number] = 
None 
  207         while serial_number 
in used_serial_numbers:
 
  208             serial_number = serial_number + 1
 
  215                 'PluginManager._load_plugin(%s) instance already loaded' % str(instance_id))
 
  219             instance_id.plugin_id == \
 
  230                     PluginHandlerXEmbed(self, self.
_main_window, instance_id,
 
  234                     'PluginManager._load_plugin() could not load plugin in a separate process')
 
  246                 'PluginManager._load_plugin() could not load plugin "%s": plugin not available' %
 
  247                 (instance_id.plugin_id))
 
  250         handler.set_plugin_descriptor(plugin_descriptor)
 
  258             self.
_plugin_menu.add_instance(plugin_descriptor, instance_id)
 
  259             handler.label_updated.connect(self.
_plugin_menu.update_plugin_instance_label)
 
  263             'instance_id': instance_id
 
  268         qDebug(
'PluginManager._load_plugin_restore()')
 
  270         if exception 
is None:
 
  275         instance_id = handler.instance_id()
 
  276         if exception 
is not None:
 
  277             if isinstance(exception, PluginLoadError):
 
  278                 qWarning(
'PluginManager._load_plugin() could not load plugin "%s": %s' %
 
  279                          (instance_id.plugin_id, exception))
 
  281                 qCritical(
'PluginManager._load_plugin() could not load plugin "%s"%s' %
 
  282                           (instance_id.plugin_id, (
':\n%s' % traceback.format_exc() 
if 
  283                            isinstance(exception, Exception) 
else '')))
 
  290         qDebug(
'PluginManager._load_plugin(%s) successful' % str(instance_id))
 
  305                 'plugin__' + instance_id.tidy_plugin_str())
 
  307                 'plugin__' + instance_id.tidy_str())
 
  308             handler = info[
'handler']
 
  309             handler.restore_settings(plugin_settings, instance_settings, callback)
 
  311             callback(instance_id)
 
  314         qDebug(
'PluginManager._emit_load_plugin_completed()')
 
  327         qDebug(
'PluginManager.unload_plugin(%s)' % str(instance_id))
 
  337                 'plugin__' + instance_id.tidy_plugin_str())
 
  339                 'plugin__' + instance_id.tidy_str())
 
  340             handler = info[
'handler']
 
  341             handler.save_settings(plugin_settings, instance_settings, callback)
 
  343             callback(instance_id)
 
  346         qDebug(
'PluginManager._unload_plugin_shutdown(%s)' % str(instance_id))
 
  352         handler = info[
'handler']
 
  354         handler.shutdown_plugin(callback)
 
  357         qDebug(
'PluginManager._unload_plugin_unload(%s)' % str(instance_id))
 
  363         handler = info[
'handler']
 
  364         handler.unload(callback)
 
  367         qDebug(
'PluginManager._unload_plugin_completed(%s)' % str(instance_id))
 
  374             info[
'handler'].label_updated.disconnect(
 
  381         qDebug(
'PluginManager.reload_plugin(%s)' % str(instance_id))
 
  391         qDebug(
'PluginManager._reload_plugin_shutdown(%s)' % str(instance_id))
 
  395         qDebug(
'PluginManager._reload_plugin_unload(%s)' % str(instance_id))
 
  399         qDebug(
'PluginManager._reload_plugin_schedule_load(%s)' % str(instance_id))
 
  405         qDebug(
'PluginManager._reload_plugin_load(%s)' % str(instance_id))
 
  409         qDebug(
'PluginManager._reload_plugin_restore()')
 
  411         if exception 
is None:
 
  419         qDebug(
'PluginManager.save_settings()')
 
  437                 instance_id = info[
'instance_id']
 
  438                 plugin_id = instance_id.plugin_id
 
  439                 if plugin_id 
not in plugins:
 
  440                     plugins[plugin_id] = []
 
  441                 plugins[plugin_id].append(instance_id.serial_number)
 
  445         if instance_id 
is not None:
 
  448             qDebug(
'PluginManager.save_settings() completed')
 
  472         if instance_id 
is not None:
 
  475             qDebug(
'PluginManager.close_application() completed')
 
  484         qDebug(
'PluginManager.restore_settings()')
 
  494             if instance_id 
not in plugins.keys():
 
  498             qDebug(
'PluginManager.restore_settings() unloading %d obsolete plugins' %
 
  500             for instance_id 
in obsolete:
 
  509             for plugin_id, serial_numbers 
in data.items():
 
  510                 for serial_number 
in serial_numbers:
 
  512                     plugins[str(instance_id)] = instance_id
 
  520         if instance_id 
is not None:
 
  524             if instance_id 
is not None:
 
  525                 qDebug(
'PluginManager.restore_settings() all obsolete plugins unloaded')
 
  533         for instance_id_str, instance_id 
in plugins.items():
 
  535                 loading.append(instance_id)
 
  538             qDebug(
'PluginManager.restore_settings() loading %d plugins' %
 
  540             for instance_id 
in loading:
 
  546         if handler 
is not None:
 
  550             if handler 
is not None:
 
  551                 qDebug(
'PluginManager.restore_settings() all missing plugins loaded')
 
  556         qDebug(
'PluginManager.restore_settings_without_plugins()')
 
  572         if instance_id 
is not None:
 
  575             if instance_id 
is not None:
 
  576                 qDebug(
'PluginManager.restore_settings() all plugin settings restored')