Exemplo n.º 1
0
 def update_background(adj):
     pos = self.get_background_position()
     i = image_from_position(self.controller,
                             position=pos,
                             media=self.parent.media)
     self.view.set_background(i)
     return True
Exemplo n.º 2
0
 def update_background(adj):
     pos = self.get_background_position()
     i = image_from_position(self.controller,
                             position=pos,
                             media=self.parent.media)
     self.view.set_background(i)
     return True
Exemplo n.º 3
0
    def set_begin(self, t):
        try:
            media = self.parent.media
        except AttributeError:
            media = None

        self.view.set_background(
            image_from_position(self.controller, position=t, media=media))
        return True
Exemplo n.º 4
0
    def set_begin(self, t):
        try:
            media = self.parent.media
        except AttributeError:
            media = None

        self.view.set_background(image_from_position(self.controller,
                                                     position=t,
                                                     media=media))
        return True
Exemplo n.º 5
0
 def snapshot_update_cb(context, target):
     if context.globals['media'] != self.parent.media:
         return True
     pos = self.get_background_position()
     if context.globals['position'] == pos:
         # Refresh image
         i = image_from_position(self.controller,
                                 position=pos,
                                 media=self.parent.media)
         self.view.set_background(i)
     return True
Exemplo n.º 6
0
 def snapshot_update_cb(context, target):
     if context.globals['media'] != self.parent.media:
         return True
     pos = self.get_background_position()
     if context.globals['position'] == pos:
         # Refresh image
         i = image_from_position(self.controller,
                                 position=pos,
                                 media=self.parent.media)
         self.view.set_background(i)
     return True
Exemplo n.º 7
0
    def get_view(self, compact=False):
        """Generate a view widget for editing zone attributes."""
        vbox = Gtk.VBox()

        if self.parent is not None and hasattr(self.parent, 'fragment'):
            # We are editing the content of an annotation. Use its snapshot as background.
            i = image_from_position(self.controller,
                                    position=self.parent.fragment.begin,
                                    media=self.parent.media,
                                    height=160)
            self.view = ShapeDrawer(callback=self.callback,
                                    background=i.get_pixbuf())
        else:
            self.view = ShapeDrawer(callback=self.callback)

        if self.element.data:
            d = self.element.parsed()
            if isinstance(d, dict):
                try:
                    x = int(float(d['x']) * self.view.canvaswidth / 100)
                    y = int(float(d['y']) * self.view.canvasheight / 100)
                    width = int(
                        float(d['width']) * self.view.canvaswidth / 100)
                    height = int(
                        float(d['height']) * self.view.canvasheight / 100)
                    self.callback(((x, y), (x + width, y + height)))
                    self.shape.name = d['name']
                except KeyError:
                    self.callback(((0.0, 0.0), (10.0, 10.0)))
                    self.shape.name = self.element.data

        # Name edition
        hb = Gtk.HBox()
        hb.pack_start(Gtk.Label(_("Label")), False, False, 0)
        self.nameentry = Gtk.Entry()
        if self.shape is not None:
            self.nameentry.set_text(self.shape.name)
        hb.pack_start(self.nameentry, True, True, 0)

        vbox.pack_start(hb, False, True, 0)

        vbox.add(self.view.widget)

        return vbox
Exemplo n.º 8
0
    def get_view (self, compact=False):
        """Generate a view widget for editing zone attributes."""
        vbox=Gtk.VBox()

        if self.parent is not None and hasattr(self.parent, 'fragment'):
            # We are editing the content of an annotation. Use its snapshot as background.
            i = image_from_position(self.controller,
                                    position=self.parent.fragment.begin,
                                    media=self.parent.media,
                                    height=160)
            self.view = ShapeDrawer(callback=self.callback, background=i.get_pixbuf())
        else:
            self.view = ShapeDrawer(callback=self.callback)

        if self.element.data:
            d=self.element.parsed()
            if isinstance(d, dict):
                try:
                    x = int(float(d['x']) * self.view.canvaswidth / 100)
                    y = int(float(d['y']) * self.view.canvasheight / 100)
                    width = int(float(d['width']) * self.view.canvaswidth / 100)
                    height = int(float(d['height']) * self.view.canvasheight / 100)
                    self.callback( ( (x, y),
                                     (x+width, y+height) ) )
                    self.shape.name = d['name']
                except KeyError:
                    self.callback( ( (0.0, 0.0),
                                     (10.0, 10.0) ) )
                    self.shape.name = self.element.data

        # Name edition
        hb=Gtk.HBox()
        hb.pack_start(Gtk.Label(_("Label")), False, False, 0)
        self.nameentry=Gtk.Entry()
        if self.shape is not None:
            self.nameentry.set_text(self.shape.name)
        hb.pack_start(self.nameentry, True, True, 0)

        vbox.pack_start(hb, False, True, 0)

        vbox.add(self.view.widget)

        return vbox
Exemplo n.º 9
0
 def snapshot_update_cb(context, target):
     if context.globals['position'] == self.parent.begin:
         # Refresh image
         i=image_from_position(self.controller, self.parent.begin)
         self.view.set_background(i)
     return True
Exemplo n.º 10
0
    def get_view (self, compact=False):
        """Generate a view widget for editing SVG."""
        vbox=gtk.VBox()

        if self.parent is not None and hasattr(self.parent, 'begin'):
            i=image_from_position(self.controller, self.parent.begin)
            self.view = ShapeEditor(background=i, pixmap_dir=config.data.advenefile('pixmaps'))

            def snapshot_update_cb(context, target):
                if context.globals['position'] == self.parent.begin:
                    # Refresh image
                    i=image_from_position(self.controller, self.parent.begin)
                    self.view.set_background(i)
                return True
            self.rules.append(self.controller.event_handler.internal_rule (event='SnapshotUpdate',
                                                                           method=snapshot_update_cb))

            def annotation_update_cb(context, target):
                i=image_from_position(self.controller, self.parent.begin)
                self.view.set_background(i)
                return True
            self.rules.append(self.controller.event_handler.internal_rule (event='AnnotationEditEnd',
                                                                           method=annotation_update_cb))

        else:
            self.view = ShapeEditor(pixmap_dir=config.data.advenefile('pixmaps'))

        self.parse_svg()

        self.view.drawer.widget.connect('drag-data-received', self.drawer_drag_received)
        self.view.drawer.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
                                              gtk.DEST_DEFAULT_HIGHLIGHT |
                                              gtk.DEST_DEFAULT_ALL,
                                              config.data.drag_type['view']
                                              + config.data.drag_type['annotation']
                                              + config.data.drag_type['uri-list'],
                                              gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)

        def edit_svg(b):
            vbox.foreach(vbox.remove)
            vbox.add(self.view.widget)

            b=gtk.Button(_("Edit XML"))
            b.connect('clicked', edit_xml)
            vbox.pack_start(b, expand=False)
            self.editing_source=False
            vbox.show_all()
            return True

        def edit_xml(b):
            if self.sourceview is None:
                self.sourceview=TextContentHandler(element=self.element,
                                                   controller=self.controller,
                                                   parent=self.parent)
                self.sourceview.widget=self.sourceview.get_view()

            vbox.foreach(vbox.remove)
            vbox.add(self.sourceview.widget)

            b=gtk.Button(_("Graphical editor"))
            b.connect('clicked', edit_svg)
            vbox.pack_start(b, expand=False)
            self.editing_source=True
            vbox.show_all()
            return True

        edit_svg(None)
        return vbox
Exemplo n.º 11
0
 def set_begin(self, t):
     i=image_from_position(self.controller, t)
     self.view.set_background(i)
     return True
Exemplo n.º 12
0
    def make_annotation_menu(self, element, menu):
        def add_item(*p, **kw):
            self.add_menuitem(menu, *p, **kw)

        def loop_on_annotation(menu, ann):
            self.controller.gui.loop_on_annotation_gui(ann, goto=True)
            return True

        def save_snapshot(menu, ann):
            self.controller.gui.save_snapshot_as(ann.fragment.begin)
            return True

        add_item(_("Go to..."), self.goto_annotation, element)
        add_item(_("Loop"), loop_on_annotation, element)
        add_item(_("Duplicate"), self.duplicate_annotation, element)
        item = gtk.MenuItem(_("Highlight"), use_underline=False)
        item.set_submenu(self.activate_submenu(element))
        menu.append(item)
        add_item(_("Save snapshot..."), save_snapshot, element)
        if 'montagerenderer' in self.controller.generic_features:
            add_item(_("Extract video fragment"), self.extract_fragment, element)

        def build_submenu(submenu, el, items):
            """Build the submenu for the given element.
            """
            if submenu.get_children():
                # The submenu was already populated.
                return False
            if len(items) == 1:
                # Only 1 elements, do not use an intermediary menu
                m=Menu(element=items[0], controller=self.controller)
                for c in m.menu.get_children():
                    m.menu.remove(c)
                    submenu.append(c)
            else:
                for i in items:
                    item=gtk.MenuItem(self.get_title(i), use_underline=False)
                    m=Menu(element=i, controller=self.controller)
                    item.set_submenu(m.menu)
                    submenu.append(item)
            submenu.show_all()
            return False

        def build_related(submenu, el):
            """Build the related annotations submenu for the given element.
            """
            if submenu.get_children():
                # The submenu was already populated.
                return False
            if el.incomingRelations:
                i=gtk.MenuItem(_("Incoming"))
                submenu.append(i)
                i=gtk.SeparatorMenuItem()
                submenu.append(i)
                for t, l in el.typedRelatedIn.iteritems():
                    at=self.controller.package.get_element_by_id(t)
                    m=gtk.MenuItem(self.get_title(at), use_underline=False)
                    amenu=gtk.Menu()
                    m.set_submenu(amenu)
                    amenu.connect('map', build_submenu, at, l)
                    submenu.append(m)
            if submenu.get_children():
                # There were incoming annotations. Use a separator
                i=gtk.SeparatorMenuItem()
                submenu.append(i)
            if el.outgoingRelations:
                i=gtk.MenuItem(_("Outgoing"))
                submenu.append(i)
                i=gtk.SeparatorMenuItem()
                submenu.append(i)
                for t, l in el.typedRelatedOut.iteritems():
                    at=self.controller.package.get_element_by_id(t)
                    m=gtk.MenuItem(self.get_title(at), use_underline=False)
                    amenu=gtk.Menu()
                    m.set_submenu(amenu)
                    amenu.connect('map', build_submenu, at, l)
                    submenu.append(m)
            submenu.show_all()
            return False

        if element.relations:
            i=gtk.MenuItem(_("Related annotations"), use_underline=False)
            submenu=gtk.Menu()
            i.set_submenu(submenu)
            submenu.connect('map', build_related, element)
            menu.append(i)

            if element.incomingRelations:
                i=gtk.MenuItem(_("Incoming relations"), use_underline=False)
                submenu=gtk.Menu()
                i.set_submenu(submenu)
                submenu.connect('map', build_submenu, element, element.incomingRelations)
                menu.append(i)

            if element.outgoingRelations:
                i=gtk.MenuItem(_("Outgoing relations"), use_underline=False)
                submenu=gtk.Menu()
                i.set_submenu(submenu)
                submenu.connect('map', build_submenu, element, element.outgoingRelations)
                menu.append(i)

        add_item("")

        item = gtk.MenuItem()
        item.add(image_from_position(self.controller,
                                     position=element.fragment.begin,
                                     height=60))
        item.connect('activate', self.goto_annotation, element)
        menu.append(item)

        #add_item(element.content.data[:40])
        add_item(_('Begin: %s')
                 % helper.format_time (element.fragment.begin), lambda i: self.controller.gui.adjust_annotation_bound(element, 'begin'))
        add_item(_('End: %s') % helper.format_time (element.fragment.end), lambda i: self.controller.gui.adjust_annotation_bound(element, 'end'))
        add_item(_('Duration: %s') % helper.format_time (element.fragment.duration))
        return
Exemplo n.º 13
0
    def get_view (self, compact=False):
        """Generate a view widget for editing SVG."""
        vbox=Gtk.VBox()

        if self.parent is not None and hasattr(self.parent, 'fragment'):
            i = image_from_position(self.controller,
                                    position=self.parent.fragment.begin,
                                    media=self.parent.media)
            vi = self.controller.package.imagecache.video_info
            self.view = ShapeEditor(background=i,
                                    icon_dir=config.data.advenefile('pixmaps'),
                                    default_size=(vi.get('width', 320), vi.get('height', 200)))

            def snapshot_update_cb(context, target):
                if context.globals['media'] != self.parent.media:
                    return True
                pos = self.get_background_position()
                if context.globals['position'] == pos:
                    # Refresh image
                    i = image_from_position(self.controller,
                                            position=pos,
                                            media=self.parent.media)
                    self.view.set_background(i)
                return True
            self.rules.append(self.controller.event_handler.internal_rule (event='SnapshotUpdate',
                                                                           method=snapshot_update_cb))

            def annotation_update_cb(context, target):
                self.view.background_adj.set_value(0)
                return True
            self.rules.append(self.controller.event_handler.internal_rule (event='AnnotationEditEnd',
                                                                           method=annotation_update_cb))

        else:
            self.view = ShapeEditor(icon_dir=config.data.advenefile('pixmaps'))

        self.parse_svg()

        self.view.drawer.widget.connect('drag-data-received', self.drawer_drag_received)
        self.view.drawer.widget.drag_dest_set(Gtk.DestDefaults.MOTION |
                                              Gtk.DestDefaults.HIGHLIGHT |
                                              Gtk.DestDefaults.ALL,
                                              config.data.get_target_types('view', 'annotation', 'uri-list'),
                                              Gdk.DragAction.COPY | Gdk.DragAction.LINK)

        def edit_svg(b=None):
            vbox.foreach(vbox.remove)
            vbox.add(self.view.widget)
            self.editing_source=False
            vbox.show_all()
            return True

        def edit_xml(b=None):
            if self.sourceview is None:
                self.sourceview=TextContentHandler(element=self.element,
                                                   controller=self.controller,
                                                   parent=self.parent)
                self.sourceview.widget=self.sourceview.get_view()
                b = get_pixmap_toolbutton('xml.png', edit_svg)
                b.set_tooltip_text(_("Graphical editor"))
                self.sourceview.toolbar.insert(b, 0)

            vbox.foreach(vbox.remove)
            vbox.add(self.sourceview.widget)
            self.editing_source=True
            vbox.show_all()
            return True

        # Insert "View source" button in Shapewidget toolbar
        b = get_pixmap_toolbutton('xml.png', edit_xml)
        b.set_tooltip_text(_("Edit XML"))
        self.view.toolbar.insert(b, 0)

        def update_background(adj):
            pos = self.get_background_position()
            i = image_from_position(self.controller,
                                    position=pos,
                                    media=self.parent.media)
            self.view.set_background(i)
            return True

        self.view.background_adj = Gtk.Adjustment.new(value=0, lower=0, upper=1.0, step_increment=0.1, page_increment=0.2, page_size=0.2)
        slider = Gtk.HScale.new(self.view.background_adj)
        slider.connect("format-value", lambda s, v: helper.format_time(self.parent.fragment.begin + int(v * self.parent.fragment.duration)))
        ti = Gtk.ToolItem()
        ti.add(slider)
        ti.set_expand(True)
        self.view.toolbar.insert(ti, -1)
        self.view.background_adj.connect('value-changed', update_background)

        if config.data.preferences['prefer-wysiwyg']:
            edit_svg()
        else:
            edit_xml()
        return vbox
Exemplo n.º 14
0
 def annotation_update_cb(context, target):
     i=image_from_position(self.controller, self.parent.begin)
     self.view.set_background(i)
     return True
Exemplo n.º 15
0
    def get_view(self, compact=False):
        """Generate a view widget for editing SVG."""
        vbox = Gtk.VBox()

        if self.parent is not None and hasattr(self.parent, 'fragment'):
            i = image_from_position(self.controller,
                                    position=self.parent.fragment.begin,
                                    media=self.parent.media)
            vi = self.controller.package.imagecache.video_info
            self.view = ShapeEditor(background=i,
                                    icon_dir=config.data.advenefile('pixmaps'),
                                    default_size=(vi.get('width', 320),
                                                  vi.get('height', 200)))

            def snapshot_update_cb(context, target):
                if context.globals['media'] != self.parent.media:
                    return True
                pos = self.get_background_position()
                if context.globals['position'] == pos:
                    # Refresh image
                    i = image_from_position(self.controller,
                                            position=pos,
                                            media=self.parent.media)
                    self.view.set_background(i)
                return True

            self.rules.append(
                self.controller.event_handler.internal_rule(
                    event='SnapshotUpdate', method=snapshot_update_cb))

            def annotation_update_cb(context, target):
                self.view.background_adj.set_value(0)
                return True

            self.rules.append(
                self.controller.event_handler.internal_rule(
                    event='AnnotationEditEnd', method=annotation_update_cb))

        else:
            self.view = ShapeEditor(icon_dir=config.data.advenefile('pixmaps'))

        self.parse_svg()

        self.view.drawer.widget.connect('drag-data-received',
                                        self.drawer_drag_received)
        self.view.drawer.widget.drag_dest_set(
            Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT
            | Gtk.DestDefaults.ALL,
            config.data.get_target_types('view', 'annotation', 'uri-list'),
            Gdk.DragAction.COPY | Gdk.DragAction.LINK)

        def edit_svg(b=None):
            vbox.foreach(vbox.remove)
            vbox.add(self.view.widget)
            self.editing_source = False
            vbox.show_all()
            return True

        def edit_xml(b=None):
            if self.sourceview is None:
                self.sourceview = TextContentHandler(
                    element=self.element,
                    controller=self.controller,
                    parent=self.parent)
                self.sourceview.widget = self.sourceview.get_view()
                b = get_pixmap_toolbutton('xml.png', edit_svg)
                b.set_tooltip_text(_("Graphical editor"))
                self.sourceview.toolbar.insert(b, 0)

            vbox.foreach(vbox.remove)
            vbox.add(self.sourceview.widget)
            self.editing_source = True
            vbox.show_all()
            return True

        # Insert "View source" button in Shapewidget toolbar
        b = get_pixmap_toolbutton('xml.png', edit_xml)
        b.set_tooltip_text(_("Edit XML"))
        self.view.toolbar.insert(b, 0)

        def update_background(adj):
            pos = self.get_background_position()
            i = image_from_position(self.controller,
                                    position=pos,
                                    media=self.parent.media)
            self.view.set_background(i)
            return True

        self.view.background_adj = Gtk.Adjustment.new(value=0,
                                                      lower=0,
                                                      upper=1.0,
                                                      step_increment=0.1,
                                                      page_increment=0.2,
                                                      page_size=0.2)
        slider = Gtk.HScale.new(self.view.background_adj)
        slider.connect(
            "format-value",
            lambda s, v: helper.format_time(self.parent.fragment.begin + int(
                v * self.parent.fragment.duration)))
        ti = Gtk.ToolItem()
        ti.add(slider)
        ti.set_expand(True)
        self.view.toolbar.insert(ti, -1)
        self.view.background_adj.connect('value-changed', update_background)

        if config.data.preferences['prefer-wysiwyg']:
            edit_svg()
        else:
            edit_xml()
        return vbox
Exemplo n.º 16
0
    def make_annotation_menu(self, element, menu):
        def add_item(*p, **kw):
            self.add_menuitem(menu, *p, **kw)

        def loop_on_annotation(menu, ann):
            self.controller.gui.loop_on_annotation_gui(ann, goto=True)
            return True

        def save_snapshot(menu, ann):
            self.controller.gui.save_snapshot_as(ann.fragment.begin)
            return True

        add_item(_("Go to..."), self.goto_annotation, element)
        add_item(_("Loop"), loop_on_annotation, element)
        add_item(_("Duplicate"), self.duplicate_annotation, element)
        item = gtk.MenuItem(_("Highlight"), use_underline=False)
        item.set_submenu(self.activate_submenu(element))
        menu.append(item)
        add_item(_("Save snapshot..."), save_snapshot, element)
        if 'montagerenderer' in self.controller.generic_features:
            add_item(_("Extract video fragment"), self.extract_fragment,
                     element)

        def build_submenu(submenu, el, items):
            """Build the submenu for the given element.
            """
            if submenu.get_children():
                # The submenu was already populated.
                return False
            if len(items) == 1:
                # Only 1 elements, do not use an intermediary menu
                m = Menu(element=items[0], controller=self.controller)
                for c in m.menu.get_children():
                    m.menu.remove(c)
                    submenu.append(c)
            else:
                for i in items:
                    item = gtk.MenuItem(self.get_title(i), use_underline=False)
                    m = Menu(element=i, controller=self.controller)
                    item.set_submenu(m.menu)
                    submenu.append(item)
            submenu.show_all()
            return False

        def build_related(submenu, el):
            """Build the related annotations submenu for the given element.
            """
            if submenu.get_children():
                # The submenu was already populated.
                return False
            if el.incomingRelations:
                i = gtk.MenuItem(_("Incoming"))
                submenu.append(i)
                i = gtk.SeparatorMenuItem()
                submenu.append(i)
                for t, l in el.typedRelatedIn.iteritems():
                    at = self.controller.package.get_element_by_id(t)
                    m = gtk.MenuItem(self.get_title(at), use_underline=False)
                    amenu = gtk.Menu()
                    m.set_submenu(amenu)
                    amenu.connect('map', build_submenu, at, l)
                    submenu.append(m)
            if submenu.get_children():
                # There were incoming annotations. Use a separator
                i = gtk.SeparatorMenuItem()
                submenu.append(i)
            if el.outgoingRelations:
                i = gtk.MenuItem(_("Outgoing"))
                submenu.append(i)
                i = gtk.SeparatorMenuItem()
                submenu.append(i)
                for t, l in el.typedRelatedOut.iteritems():
                    at = self.controller.package.get_element_by_id(t)
                    m = gtk.MenuItem(self.get_title(at), use_underline=False)
                    amenu = gtk.Menu()
                    m.set_submenu(amenu)
                    amenu.connect('map', build_submenu, at, l)
                    submenu.append(m)
            submenu.show_all()
            return False

        if element.relations:
            i = gtk.MenuItem(_("Related annotations"), use_underline=False)
            submenu = gtk.Menu()
            i.set_submenu(submenu)
            submenu.connect('map', build_related, element)
            menu.append(i)

            if element.incomingRelations:
                i = gtk.MenuItem(_("Incoming relations"), use_underline=False)
                submenu = gtk.Menu()
                i.set_submenu(submenu)
                submenu.connect('map', build_submenu, element,
                                element.incomingRelations)
                menu.append(i)

            if element.outgoingRelations:
                i = gtk.MenuItem(_("Outgoing relations"), use_underline=False)
                submenu = gtk.Menu()
                i.set_submenu(submenu)
                submenu.connect('map', build_submenu, element,
                                element.outgoingRelations)
                menu.append(i)

        add_item("")

        item = gtk.MenuItem()
        item.add(
            image_from_position(self.controller,
                                position=element.fragment.begin,
                                height=60))
        item.connect('activate', self.goto_annotation, element)
        menu.append(item)

        #add_item(element.content.data[:40])
        add_item(
            _('Begin: %s') % helper.format_time(element.fragment.begin),
            lambda i: self.controller.gui.adjust_annotation_bound(
                element, 'begin'))
        add_item(
            _('End: %s') % helper.format_time(element.fragment.end),
            lambda i: self.controller.gui.adjust_annotation_bound(
                element, 'end'))
        add_item(
            _('Duration: %s') % helper.format_time(element.fragment.duration))
        return
Exemplo n.º 17
0
    def make_annotation_menu(self, element, menu):
        def add_item(*p, **kw):
            self.add_menuitem(menu, *p, **kw)

        def loop_on_annotation(menu, ann):
            self.controller.gui.loop_on_annotation_gui(ann, goto=True)
            return True

        add_item(_("Go to..."), self.goto_annotation, element)
        add_item(_("Loop"), loop_on_annotation, element)
        add_item(_("Duplicate"), self.duplicate_annotation, element)
        item = gtk.MenuItem(_("Highlight"), use_underline=False)
        item.set_submenu(self.activate_submenu(element))
        menu.append(item)

        def build_submenu(submenu, el, items):
            """Build the submenu for the given element.
            """
            if submenu.get_children():
                # The submenu was already populated.
                return False
            if len(items) == 1:
                # Only 1 elements, do not use an intermediary menu
                m=Menu(element=items[0], controller=self.controller)
                for c in m.menu.get_children():
                    m.menu.remove(c)
                    submenu.append(c)
            else:
                for i in items:
                    item=gtk.MenuItem(self.get_title(i), use_underline=False)
                    m=Menu(element=i, controller=self.controller)
                    item.set_submenu(m.menu)
                    submenu.append(item)
            submenu.show_all()
            return False

        def build_related(submenu, el):
            """Build the related annotations submenu for the given element.
            """
            if submenu.get_children():
                # The submenu was already populated.
                return False

            if el.incoming_relations:
                i=gtk.MenuItem(_("Incoming"))
                submenu.append(i)
                i=gtk.SeparatorMenuItem()
                submenu.append(i)
                for at, l in el.typed_related_in:
                    m=gtk.MenuItem(self.controller.get_title(at), use_underline=False)
                    amenu=gtk.Menu()
                    m.set_submenu(amenu)
                    amenu.connect('map', build_submenu, at, list(l))
                    submenu.append(m)
            if submenu.get_children():
                # There were incoming annotations. Use a separator
                i=gtk.SeparatorMenuItem()
                submenu.append(i)
            if el.outgoing_relations:
                i=gtk.MenuItem(_("Outgoing"))
                submenu.append(i)
                i=gtk.SeparatorMenuItem()
                submenu.append(i)
                for at, l in el.typed_related_out:
                    m=gtk.MenuItem(self.controller.get_title(at), use_underline=False)
                    amenu=gtk.Menu()
                    m.set_submenu(amenu)
                    amenu.connect('map', build_submenu, at, list(l))
                    submenu.append(m)
            submenu.show_all()
            return False


        if element.relations:
            i=gtk.MenuItem(_("Related annotations"), use_underline=False)
            submenu=gtk.Menu()
            i.set_submenu(submenu)
            submenu.connect('map', build_related, element)
            menu.append(i)

            if element.incoming_relations:
                i=gtk.MenuItem(_("Incoming relations"), use_underline=False)
                submenu=gtk.Menu()
                i.set_submenu(submenu)
                submenu.connect('map', build_submenu, element, element.incoming_relations)
                menu.append(i)

            if element.outgoing_relations:
                i=gtk.MenuItem(_("Outgoing relations"), use_underline=False)
                submenu=gtk.Menu()
                i.set_submenu(submenu)
                submenu.connect('map', build_submenu, element, element.outgoing_relations)
                menu.append(i)

        add_item("")

        item = gtk.MenuItem()
        item.add(image_from_position(self.controller,
                                     position=element.begin,
                                     height=60))
        item.connect('activate', self.goto_annotation, element)
        menu.append(item)

        #add_item(element.content.data[:40])
        add_item(_('Begin: %s')
                 % helper.format_time (element.begin))
        add_item(_('End: %s') % helper.format_time (element.end))
        return