def __init__(self, pageview):
        self.pageview = pageview
        self.edit_format_actions = (
            pageview.toggle_format_strong,
            pageview.toggle_format_emphasis,
            pageview.toggle_format_mark,
            pageview.toggle_format_strike,
            pageview.toggle_format_code,
            pageview.toggle_format_sub,
            pageview.toggle_format_sup,
        )
        self.edit_menus = (
            ('_List', 'view-list-symbolic', self._create_list_menu()),
            ('_Heading', 'format-text-heading-symbolic',
             self._create_head_menu()),
            ('_Insert', 'insert-image-symbolic', self._create_insert_menu()),
        )
        self.edit_clear_action = pageview.clear_formatting

        def on_extensions_changed(o, obj):
            if obj in (pageview, PluginManager.insertedobjects):
                self._update_insert_menu()

        PluginManager.connect('extensions-changed', on_extensions_changed)
class InsertedObjectUI(object):
    def __init__(self, uimanager, pageview):
        self.uimanager = uimanager
        self.pageview = pageview
        self.insertedobjects = PluginManager().insertedobjects
        self._ui_id = None
        self._actiongroup = None
        self.add_ui()
        self.insertedobjects.connect('changed', self.on_changed)

    def on_changed(self, o):
        self.uimanager.remove_ui(self._ui_id)
        self.uimanager.remove_action_group(self._actiongroup)
        self._ui_id = None
        self._actiongroup = None
        self.add_ui()

    def add_ui(self):
        assert self._ui_id is None
        assert self._actiongroup is None

        self._actiongroup = self.get_actiongroup()
        ui_xml = self.get_ui_xml()

        self.uimanager.insert_action_group(self._actiongroup, 0)
        self._ui_id = self.uimanager.add_ui_from_string(ui_xml)

    def get_actiongroup(self):
        actions = [('insert_' + obj.name, obj.verb_icon, obj.label, '', None,
                    self._action_handler)
                   for obj in self.insertedobjects.values()]
        group = Gtk.ActionGroup('inserted_objects')
        group.add_actions(actions)
        return group

    def get_ui_xml(self):
        menulines = []
        toollines = []
        for obj in self.insertedobjects.values():
            name = 'insert_' + obj.name
            menulines.append("<menuitem action='%s'/>\n" % name)
            if obj.verb_icon is not None:
                toollines.append("<toolitem action='%s'/>\n" % name)
        return """\
		<ui>
			<menubar name='menubar'>
				<menu action='insert_menu'>
					<placeholder name='plugin_items'>
					 %s
					</placeholder>
				</menu>
			</menubar>
			<toolbar name='toolbar'>
				<placeholder name='insert_plugin_items'>
				%s
				</placeholder>
			</toolbar>
		</ui>
		""" % (
            ''.join(menulines),
            ''.join(toollines),
        )

    def _action_handler(self, action):
        try:
            name = action.get_name()[7:]  # len('insert_') = 7
            otype = self.insertedobjects[name]
            pageview = self.pageview
            notebook = pageview.notebook
            page = pageview.page
            try:
                model = otype.new_model_interactive(self.pageview, notebook,
                                                    page)
            except ValueError:
                return  # dialog cancelled
            self.pageview.insert_object_model(otype, model)
        except:
            zim.errors.exception_handler('Exception during action: %s' % name)