| 1 |
""" |
|---|
| 2 |
""" |
|---|
| 3 |
|
|---|
| 4 |
import gtk |
|---|
| 5 |
from zope import interface, component |
|---|
| 6 |
from gaphor.core import inject |
|---|
| 7 |
from gaphor.interfaces import IService, IActionProvider |
|---|
| 8 |
from gaphor.event import ServiceInitializedEvent, ActionExecuted |
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
class ActionManager(object): |
|---|
| 12 |
""" |
|---|
| 13 |
This service is responsible for maintaining actions. |
|---|
| 14 |
""" |
|---|
| 15 |
|
|---|
| 16 |
interface.implements(IService) |
|---|
| 17 |
|
|---|
| 18 |
def __init__(self): |
|---|
| 19 |
pass |
|---|
| 20 |
|
|---|
| 21 |
def init(self, app): |
|---|
| 22 |
self._app = app |
|---|
| 23 |
self.ui_manager = gtk.UIManager() |
|---|
| 24 |
log.info('Loading not yet registered action provider services') |
|---|
| 25 |
for name, service in component.getUtilitiesFor(IService): |
|---|
| 26 |
if IActionProvider.providedBy(service): |
|---|
| 27 |
log.debug('Loading already registered service %s' % str(service)) |
|---|
| 28 |
self.register_action_provider(service) |
|---|
| 29 |
|
|---|
| 30 |
app.register_handler(self._service_initialized_handler) |
|---|
| 31 |
|
|---|
| 32 |
def shutdown(self): |
|---|
| 33 |
self._app.unregister_handler(self._service_initialized_handler) |
|---|
| 34 |
|
|---|
| 35 |
def execute(self, action_id, active=None): |
|---|
| 36 |
a = self.get_action(action_id) |
|---|
| 37 |
if a: |
|---|
| 38 |
a.activate() |
|---|
| 39 |
component.handle(ActionExecuted(action_id, a)) |
|---|
| 40 |
else: |
|---|
| 41 |
log.warning('Unknown action: %s' % action_id) |
|---|
| 42 |
|
|---|
| 43 |
def update_actions(self): |
|---|
| 44 |
self.ui_manager.ensure_update() |
|---|
| 45 |
|
|---|
| 46 |
def get_action(self, action_id): |
|---|
| 47 |
for g in self.ui_manager.get_action_groups(): |
|---|
| 48 |
a = g.get_action(action_id) |
|---|
| 49 |
if a: return a |
|---|
| 50 |
|
|---|
| 51 |
def register_action_provider(self, action_provider): |
|---|
| 52 |
action_provider = IActionProvider(action_provider) |
|---|
| 53 |
try: |
|---|
| 54 |
|
|---|
| 55 |
action_provider.__ui_merge_id |
|---|
| 56 |
except AttributeError: |
|---|
| 57 |
log.debug('Registering actions for %s' % str(action_provider)) |
|---|
| 58 |
|
|---|
| 59 |
assert action_provider.action_group |
|---|
| 60 |
self.ui_manager.insert_action_group(action_provider.action_group, -1) |
|---|
| 61 |
if action_provider.menu_xml: |
|---|
| 62 |
action_provider.__ui_merge_id = \ |
|---|
| 63 |
self.ui_manager.add_ui_from_string(action_provider.menu_xml) |
|---|
| 64 |
|
|---|
| 65 |
@component.adapter(ServiceInitializedEvent) |
|---|
| 66 |
def _service_initialized_handler(self, event): |
|---|
| 67 |
if IActionProvider.providedBy(event.service): |
|---|
| 68 |
log.debug('Loading registered service %s' % str(event.service)) |
|---|
| 69 |
self.register_action_provider(event.service) |
|---|
| 70 |
|
|---|
| 71 |
|
|---|
| 72 |
|
|---|