示例#1
0
文件: tree.py 项目: eamexicano/advene
 def nodeParent (self, node):
     #print "nodeparent %s" % node
     if isinstance (node, Annotation):
         parent = node.type
     elif isinstance (node, Relation):
         parent = node.type
     elif isinstance (node, RelationType):
         parent = node.schema
     elif isinstance (node, AnnotationType):
         parent = node.schema
     elif isinstance (node, Schema):
         parent = node.rootPackage.schemas
     elif isinstance (node, View):
         if node.id.startswith('_'):
             parent=self.virtual['admin']
         else:
             t=helper.get_view_type(node)
             parent=self.virtual[t]
     elif isinstance (node, Query):
         parent = node.rootPackage.queries
     elif isinstance (node, Package):
         parent = None
     elif isinstance (node, AbstractBundle):
         parent = node.rootPackage
     elif isinstance (node, Resources):
         parent = node.parent
     elif isinstance (node, ResourceData):
         parent = node.parent
     elif node in (self.virtual['static'], self.virtual['dynamic'], self.virtual['adhoc'], self.virtual['admin']):
         parent = self.virtual['views']
     elif node == self.virtual['views']:
         parent=node.rootPackage
     else:
         parent = None
     return parent
示例#2
0
def get_target_types(el):
    """Return DND target types for element.
    """
    targets = []
    if isinstance(el, Annotation):
        targets.extend(config.data.get_target_types('annotation', 'timestamp', 'tag'))
    elif isinstance(el, Relation):
        targets.extend(config.data.get_target_types('relation'))
    elif isinstance(el, View):
        if helper.get_view_type(el) == 'adhoc':
            targets.extend(config.data.get_target_types('adhoc-view'))
        else:
            targets.extend(config.data.get_target_types('view'))
    elif isinstance(el, AnnotationType):
        targets.extend(config.data.get_target_types('annotation-type'))
    elif isinstance(el, RelationType):
        targets.extend(config.data.get_target_types('relation-type'))
    elif isinstance(el, Query):
        targets.extend(config.data.get_target_types('query'))
    elif isinstance(el, Schema):
        targets.extend(config.data.get_target_types('schema'))
    elif isinstance(el, int):
        targets.extend(config.data.get_target_types('timestamp'))
    # FIXME: Resource

    targets.extend(config.data.get_target_types('uri-list',
                                                'text-plain',
                                                'TEXT',
                                                'STRING'))
    return targets
示例#3
0
    def __init__(self, controller, destination='/tmp/n', views=None, max_depth=3, progress_callback=None, video_url=None):
        self.controller=controller

        # Directory creation/checks
        self.destination=destination
        self.imgdir=os.path.join(self.destination, 'imagecache')

        if os.path.exists(self.destination) and not os.path.isdir(self.destination):
            self.log(_("%s exists but is not a directory. Cancelling website export") % self.destination)
            return
        elif not os.path.exists(self.destination):
            helper.recursive_mkdir(self.destination)

        if not os.path.isdir(self.destination):
            self.log(_("%s does not exist") % self.destination)
            return

        if views is None:
            views=[ v
                    for v in self.controller.package.views
                    if (not v.id.startswith('_')
                        and v.matchFilter['class'] == 'package'
                        and helper.get_view_type(v) == 'static')
                    ]
        self.views=views
        self.max_depth=max_depth
        if progress_callback is not None:
            # Override dummy progress_callback
            self.progress_callback=progress_callback
        self.video_url=video_url
        self.video_player=self.find_video_player(video_url)

        self.url_translation={}
示例#4
0
def get_target_types(el):
    """Return DND target types for element.
    """
    targets = []
    if isinstance(el, Annotation):
        targets.extend(config.data.drag_type['annotation'] +
                       config.data.drag_type['timestamp'] +
                       config.data.drag_type['tag'])
    elif isinstance(el, Relation):
        targets.extend(config.data.drag_type['relation'])
    elif isinstance(el, View):
        if helper.get_view_type(el) == 'adhoc':
            targets.extend(config.data.drag_type['adhoc-view'])
        else:
            targets.extend(config.data.drag_type['view'])
    elif isinstance(el, AnnotationType):
        targets.extend(config.data.drag_type['annotation-type'])
    elif isinstance(el, RelationType):
        targets.extend(config.data.drag_type['relation-type'])
    elif isinstance(el, Query):
        targets.extend(config.data.drag_type['query'])
    elif isinstance(el, Schema):
        targets.extend(config.data.drag_type['schema'])
    elif isinstance(el, (int, long)):
        targets.extend(config.data.drag_type['timestamp'])
    # FIXME: Resource

    targets.extend(config.data.drag_type['uri-list'] +
                   config.data.drag_type['text-plain'] +
                   config.data.drag_type['TEXT'] +
                   config.data.drag_type['STRING'])
    return targets
示例#5
0
    def __init__(self, controller, destination='/tmp/n', views=None, max_depth=3, progress_callback=None, video_url=None):
        self.controller=controller

        # Directory creation/checks
        self.destination=destination
        self.imgdir=os.path.join(self.destination, 'imagecache')

        if os.path.exists(self.destination) and not os.path.isdir(self.destination):
            self.log(_("%s exists but is not a directory. Cancelling website export") % self.destination)
            return
        elif not os.path.exists(self.destination):
            helper.recursive_mkdir(self.destination)

        if not os.path.isdir(self.destination):
            self.log(_("%s does not exist") % self.destination)
            return

        if views is None:
            views=[ v
                    for v in self.controller.package.views
                    if (not v.id.startswith('_')
                        and v.matchFilter['class'] == 'package'
                        and helper.get_view_type(v) == 'static')
                    ]
        self.views=views
        self.max_depth=max_depth
        if progress_callback is not None:
            # Override dummy progress_callback
            self.progress_callback=progress_callback
        self.video_url=video_url
        self.video_player=self.find_video_player(video_url)

        self.url_translation={}
示例#6
0
def get_target_types(el):
    """Return DND target types for element.
    """
    targets = []
    if isinstance(el, Annotation):
        targets.extend(config.data.get_target_types('annotation', 'timestamp', 'tag'))
    elif isinstance(el, Relation):
        targets.extend(config.data.get_target_types('relation'))
    elif isinstance(el, View):
        if helper.get_view_type(el) == 'adhoc':
            targets.extend(config.data.get_target_types('adhoc-view'))
        else:
            targets.extend(config.data.get_target_types('view'))
    elif isinstance(el, AnnotationType):
        targets.extend(config.data.get_target_types('annotation-type'))
    elif isinstance(el, RelationType):
        targets.extend(config.data.get_target_types('relation-type'))
    elif isinstance(el, Query):
        targets.extend(config.data.get_target_types('query'))
    elif isinstance(el, Schema):
        targets.extend(config.data.get_target_types('schema'))
    elif isinstance(el, int):
        targets.extend(config.data.get_target_types('timestamp'))
    # FIXME: Resource

    targets.extend(config.data.get_target_types('uri-list',
                                                'text-plain',
                                                'TEXT',
                                                'STRING'))
    return targets
示例#7
0
def get_target_types(el):
    """Return DND target types for element.
    """
    targets = []
    if isinstance(el, Annotation):
        targets.extend(config.data.drag_type['annotation']
                       + config.data.drag_type['timestamp']
                       + config.data.drag_type['tag'])
    elif isinstance(el, Relation):
        targets.extend(config.data.drag_type['relation'])
    elif isinstance(el, View):
        if helper.get_view_type(el) == 'adhoc':
            targets.extend(config.data.drag_type['adhoc-view'])
        else:
            targets.extend(config.data.drag_type['view'])
    elif isinstance(el, AnnotationType):
        targets.extend(config.data.drag_type['annotation-type'])
    elif isinstance(el, RelationType):
        targets.extend(config.data.drag_type['relation-type'])
    elif isinstance(el, Query):
        targets.extend(config.data.drag_type['query'])
    elif isinstance(el, Schema):
        targets.extend(config.data.drag_type['schema'])
    elif isinstance(el, (int, long)):
        targets.extend(config.data.drag_type['timestamp'])
    # FIXME: Resource

    targets.extend(config.data.drag_type['uri-list']
                   + config.data.drag_type['text-plain']
                   + config.data.drag_type['TEXT']
                   + config.data.drag_type['STRING'])
    return targets
示例#8
0
文件: actions.py 项目: cclauss/advene
 def OpenStaticView_predefined(self, controller):
     """Return the predefined values.
     """
     return { 'viewid': [ ('string:%s' % v.id, controller.get_title(v))
                          for v in controller.package.views
                          if helper.get_view_type(v) == 'static'
                          and v.matchFilter['class'] in ('package', '*') ] }
示例#9
0
 def OpenStaticView_predefined(self, controller):
     """Return the predefined values.
     """
     # FIXME: find the appropriate constraint (toplevel)
     return { 'viewid': [ ('string:%s' % v.id, controller.get_title(v))
                          for v in controller.package.all.views
                          if helper.get_view_type(v) == 'static' ] }
示例#10
0
    def action_open_view(self, context, parameters):
        """Event Handler for the OpenView action.

        The parameters should have a 'id' key.
        """
        view = parameters['id']
        v = self.controller.package.get_element_by_id(view)
        t = helper.get_view_type(v)
        if t == 'static':
            # Static view. If it can be applied to the package, then
            # apply it. Else open the view itself.
            if v.matchFilter['class'] in ('package', '*'):
                ctx = self.controller.build_context()
                url = ctx.evaluateValue('here/view/%s/absolute_url' % v.id)
            else:
                ctx = self.controller.build_context(here=v)
                url = ctx.evaluateValue('here/absolute_url')
            if url:
                self.controller.open_url(url)
        elif t == 'dynamic':
            self.controller.activate_stbv(v)
            p = self.controller.player
            if p.status != p.PlayingStatus:
                self.controller.update_status('start')
        elif t == 'adhoc':
            self.controller.gui.open_adhoc_view(v, 'south')
        else:
            self.log(_("Element %s does not look like a view") % view)

        return True
示例#11
0
    def update(self, node=None):
        self.node = node
        self.element = self.node

        self.label['title'].set_markup(
            _("View <b>%(title)s</b>\nId: %(id)s") % {
                'title':
                self.controller.get_title(self.element).replace('<', '&lt;'),
                'id':
                self.element.id
            })

        t = helper.get_view_type(self.element)
        self.label['activate'].set_sensitive(True)
        if t == 'static':
            self.label['activate'].set_label(_("Open in webbrowser"))
            self.label['info'].set_markup(
                _("View applied to %s\n") % self.element.matchFilter['class'])
            if not self.element.matchFilter['class'] in ('package', '*'):
                self.label['activate'].set_sensitive(False)
        elif t == 'dynamic':
            self.label['info'].set_text('')
            self.label['activate'].set_label(_("Activate"))
        elif t == 'adhoc':
            self.label['info'].set_text('')
            self.label['activate'].set_label(_("Open in GUI"))
        else:
            self.label['activate'].set_label(_("Unknown type of view??"))
            self.label['activate'].set_sensitive(False)
        return True
示例#12
0
    def action_open_view (self, context, parameters):
        """Event Handler for the OpenView action.

        The parameters should have a 'id' key.
        """
        view=parameters['id']
        v=self.controller.package.get_element_by_id(view)
        t=helper.get_view_type(v)
        if t == 'static':
            # Static view. If it can be applied to the package, then
            # apply it. Else open the view itself.
            if v.matchFilter['class'] in ('package', '*'):
                ctx=self.controller.build_context()
                url=ctx.evaluateValue('here/view/%s/absolute_url' % v.id)
            else:
                ctx=self.controller.build_context(here=v)
                url=ctx.evaluateValue('here/absolute_url')
            if url:
                self.controller.open_url(url)
        elif t == 'dynamic':
            self.controller.activate_stbv(v)
            p=self.controller.player
            if p.status != p.PlayingStatus:
                self.controller.update_status('start')
        elif t == 'adhoc':
            self.controller.gui.open_adhoc_view(v, 'south')
        else:
            self.log(_("Element %s does not look like a view") % view)

        return True
示例#13
0
    def update(self, node=None):
        self.node=node
        self.element=self.node[DetailedTreeModel.COLUMN_ELEMENT]

        self.label['title'].set_markup(_("View <b>%(title)s</b>\nId: %(id)s") % {
                'title': self.controller.get_title(self.element).replace('<', '&lt;'),
                'id': self.element.id })

        t=helper.get_view_type(self.element)
        self.label['activate'].set_sensitive(True)
        if t == 'static':
            self.label['activate'].set_label(_("Open in webbrowser"))
            self.label['info'].set_markup(_("View applied to %s\n") % self.element.matchFilter['class'])
            if not self.element.matchFilter['class'] in ('package', '*'):
                self.label['activate'].set_sensitive(False)
        elif t == 'dynamic':
            self.label['info'].set_text('')
            self.label['activate'].set_label(_("Activate"))
        elif t == 'adhoc':
            self.label['info'].set_text('')
            self.label['activate'].set_label(_("Open in GUI"))
        else:
            self.label['activate'].set_label(_("Unknown type of view??"))
            self.label['activate'].set_sensitive(False)
        return True
示例#14
0
 def ActivateSTBV_predefined(self, controller):
     """Return the predefined values.
     """
     return {
         'viewid': [('string:%s' % v.id, controller.get_title(v))
                    for v in controller.package.views
                    if helper.get_view_type(v) == 'dynamic']
     }
示例#15
0
文件: finder.py 项目: oaubert/advene
 def nodeChildren (self, node):
     #logger.warn("nodechildren %s %s", type(node), node)
     children = []
     if isinstance (node, Annotation):
         children = []
     elif isinstance (node, Relation):
         children = []
     elif isinstance (node, AnnotationType):
         if not node in self.childrencache:
             self.childrencache[node] = node.annotations
         children = self.childrencache[node]
     elif isinstance (node, RelationType):
         if not node in self.childrencache:
             self.childrencache[node] = node.relations
         children = self.childrencache[node]
     elif isinstance (node, Schema):
         # Do not cache these elements
         l=list(node.annotationTypes)
         l.extend(node.relationTypes)
         children = l
     elif isinstance (node, View):
         children = []
     elif isinstance (node, Query):
         children = []
     elif isinstance (node, Package):
         if not node in self.childrencache:
             self.childrencache[node] = [node.schemas, self.virtual['views'], node.queries, node.resources or _("No resources") ]
         children = self.childrencache[node]
     elif isinstance (node, AbstractBundle):
         children = node
     elif isinstance (node, Resources):
         if not node in self.childrencache:
             self.childrencache[node] = node.children()
         children = self.childrencache[node]
     elif isinstance (node, ResourceData):
         children = []
     elif node == self.virtual['views']:
         children=[ self.virtual['static'], self.virtual['dynamic'], self.virtual['adhoc'], self.virtual['admin'] ]
     elif node is []:
         children = [ self.get_package() ]
     else:
         children = []
         if node == self.virtual['admin']:
             children=sorted([ v
                               for v in node.rootPackage.views
                               if v.id.startswith('_') ],
                             key=lambda e: (e.title or e.id).lower())
         else:
             for t in ('static', 'dynamic', 'adhoc'):
                 if node == self.virtual[t]:
                     children=sorted([ v
                                       for v in node.rootPackage.views
                                       if not v.id.startswith('_')
                                       and helper.get_view_type(v) == t ],
                                     key=lambda e: (e.title or e.id).lower())
                     break
     return children
示例#16
0
文件: rules.py 项目: cclauss/advene
    def refresh(self):
        self.store.clear()
        l = [
            v for v in self.controller.package.views
            if helper.get_view_type(v) == 'dynamic'
        ]
        for v in l:

            self.store.append(
                [v, self.controller.get_title(v), v.id, v.id in self.model])
示例#17
0
    def refresh(self):
        self.store.clear()
        l=[ v
            for v in self.controller.package.views
            if helper.get_view_type(v) == 'dynamic' ]
        for v in l:

            self.store.append([ v,
                                self.controller.get_title(v),
                                v.id,
                                v.id in self.model ])
示例#18
0
文件: tree.py 项目: eamexicano/advene
 def row_activated_cb(self, widget, path, view_column):
     """Edit the element on Return or double click
     """
     node = self.get_selected_node (widget)
     if node is not None:
         # If node is an adhoc-view, then open it.
         if isinstance(node, View) and helper.get_view_type(node) == 'adhoc':
             self.controller.gui.open_adhoc_view(node)
         else:
             self.controller.gui.edit_element(node)
         return True
     return False
示例#19
0
 def activate(self, *p):
     """Action to be executed.
     """
     t=helper.get_view_type(self.element)
     if t == 'static':
         c=self.controller.build_context()
         url=c.evaluateValue('here/view/%s/absolute_url' % self.element.id)
         self.controller.open_url(url)
     elif t == 'dynamic':
         self.controller.activate_stbv(self.element)
     elif t == 'adhoc':
         self.controller.gui.open_adhoc_view(self.element, destination='east')
     return True
示例#20
0
 def row_activated_cb(self, widget, path, view_column):
     """Edit the element on Return or double click
     """
     node = self.get_selected_node(widget)
     if node is not None:
         # If node is an adhoc-view, then open it.
         if isinstance(node,
                       View) and helper.get_view_type(node) == 'adhoc':
             self.controller.gui.open_adhoc_view(node)
         else:
             self.controller.gui.edit_element(node)
         return True
     return False
示例#21
0
 def drag_data_get_cb(button, context, selection, targetType, timestamp):
     if targetType == config.data.target_type['adhoc-view']:
         if not isinstance(self.element, View):
             return False
         if helper.get_view_type(self.element) != 'adhoc':
             return False
         selection.set(selection.target, 8,
                       urllib.urlencode( {
                     'id': self.element.id,
                     } ).encode('utf8'))
         return True
     else:
         print "Unknown target type for drag: %d" % targetType
     return True
示例#22
0
 def activate(self, *p):
     """Action to be executed.
     """
     t = helper.get_view_type(self.element)
     if t == 'static':
         c = self.controller.build_context()
         url = c.evaluateValue('here/view/%s/absolute_url' %
                               self.element.id)
         self.controller.open_url(url)
     elif t == 'dynamic':
         self.controller.activate_stbv(self.element)
     elif t == 'adhoc':
         self.controller.gui.open_adhoc_view(self.element,
                                             destination='east')
     return True
示例#23
0
文件: finder.py 项目: oaubert/advene
 def activate(self, *p):
     """Action to be executed.
     """
     t=helper.get_view_type(self.element)
     if t == 'static':
         c=self.controller.build_context()
         try:
             url=c.evaluateValue('here/view/%s/absolute_url' % self.element.id)
             self.controller.open_url(url)
         except:
             logger.warn("Cannot open static view: error when trying to get its url", exc_info=True)
     elif t == 'dynamic':
         self.controller.activate_stbv(self.element)
     elif t == 'adhoc':
         self.controller.gui.open_adhoc_view(self.element, destination='east')
     return True
示例#24
0
 def drag_data_get_cb(button, context, selection, targetType,
                      timestamp):
     if targetType == config.data.target_type['adhoc-view']:
         if not isinstance(self.element, View):
             return False
         if helper.get_view_type(self.element) != 'adhoc':
             return False
         selection.set(
             selection.get_target(), 8,
             urllib.parse.urlencode({
                 'id': self.element.id,
             }).encode('utf8'))
         return True
     else:
         logger.warning("Unknown target type for drag: %d", targetType)
     return True
示例#25
0
文件: popup.py 项目: pchampin/advene
    def make_view_menu(self, element, menu):
        def open_in_browser(i, v):
            c=self.controller.build_context()
            url=c.evaluateValue('here/view/%s/absolute_url' % v.id)
            self.controller.open_url(url)
            return True

        def add_item(*p, **kw):
            self.add_menuitem(menu, *p, **kw)
        t=helper.get_view_type(element)
        if t == 'dynamic':
            add_item(_('Activate view'), self.activate_stbv, element)
        elif t == 'adhoc':
            add_item(_('Open adhoc view'), self.open_adhoc_view, element)
        elif t == 'static' and element.matchFilter['class'] in ('package', '*'):
            add_item(_('Open in web browser'), open_in_browser, element)
        return
示例#26
0
    def check_requirements(self):
        self.output = Path(self.output)
        self.imgdir = self.output / 'imagecache'

        if self.callback is None:
            self.callback = lambda progress, message: True

        if self.output.exists() and not self.output.is_dir():
            self.log(_("%s exists but is not a directory. Cancelling website export") % self.output)
            return
        elif not self.output.exists():
            self.output.mkdir(parents=True)

        # Last check, to be sure
        if not self.output.is_dir():
            self.log(_("%s does not exist") % self.output)
            return

        if self.views:
            # Specified view ids, should be a list of string, convert them to a list of views
            viewlist = [ (v.strip(), self.controller.package.get_element_by_id(v)) for v in self.views.split(",") ]
            missing_views = [ n[0] for n in viewlist if n[1] is None ]
            if missing_views:
                logger.error(_("The following views do not exist: %s"), ", ".join(missing_views))
            views = [ n[1] for n in viewlist if n[1] is not None ]
        else:
            # Empty, use all views
            views = [ v
                      for v in self.controller.package.views
                      if (not v.id.startswith('_') # Do not include admin views
                          and v.matchFilter['class'] == 'package'
                          and helper.get_view_type(v) == 'static')
                     ]
        defaultview = self.controller.package.getMetaData(config.data.namespace, 'default_utbv')
        v = self.controller.package.views.get_by_id(defaultview)
        if v is not None and v not in views:
            # The specified default view is not present in views
            # (probably because it starts with _). Add it.
            views.append(v)

        self.views = views

        self.video_player = self.find_video_player(self.video_url)
        self.url_translation = {}
示例#27
0
 def activate(self, *p):
     """Action to be executed.
     """
     t = helper.get_view_type(self.element)
     if t == 'static':
         c = self.controller.build_context()
         try:
             url = c.evaluateValue('here/view/%s/absolute_url' %
                                   self.element.id)
             self.controller.open_url(url)
         except:
             logger.warning(
                 "Cannot open static view: error when trying to get its url",
                 exc_info=True)
     elif t == 'dynamic':
         self.controller.activate_stbv(self.element)
     elif t == 'adhoc':
         self.controller.gui.open_adhoc_view(self.element,
                                             destination='east')
     return True
示例#28
0
文件: finder.py 项目: oaubert/advene2
    def update(self, node=None):
        self.node=node
        self.element=self.node.element

        self.label['title'].set_markup(_("View <b>%(title)s</b>\nId: %(id)s") % {
                'title': self.controller.get_title(self.element).replace('<', '&lt;'),
                'id': self.element.id })

        t=helper.get_view_type(self.element)
        self.label['activate'].set_sensitive(True)
        if t == 'static':
            self.label['activate'].set_label(_("Open in webbrowser"))
            # FIXME: check toplevel metadata
            #if not self.element.matchFilter['class'] in ('package', '*'):
            #    self.label['activate'].set_sensitive(False)
        elif t == 'dynamic':
            self.label['activate'].set_label(_("Activate"))
        elif t == 'adhoc':
            self.label['activate'].set_label(_("Open in GUI"))
        else:
            self.label['activate'].set_label(_("Unknown type of view??"))
            self.label['activate'].set_sensitive(False)
        return True
示例#29
0
 def nodeParent(self, node):
     #logger.warning("nodeparent %s", node)
     if isinstance(node, Annotation):
         parent = node.type
     elif isinstance(node, Relation):
         parent = node.type
     elif isinstance(node, RelationType):
         parent = node.schema
     elif isinstance(node, AnnotationType):
         parent = node.schema
     elif isinstance(node, Schema):
         parent = node.rootPackage.schemas
     elif isinstance(node, View):
         if node.id.startswith('_'):
             parent = self.virtual['admin']
         else:
             t = helper.get_view_type(node)
             parent = self.virtual[t]
     elif isinstance(node, Query):
         parent = node.rootPackage.queries
     elif isinstance(node, Package):
         parent = None
     elif isinstance(node, AbstractBundle):
         parent = node.rootPackage
     elif isinstance(node, Resources):
         parent = node.parent
     elif isinstance(node, ResourceData):
         parent = node.parent
     elif node in (self.virtual['static'], self.virtual['dynamic'],
                   self.virtual['adhoc'], self.virtual['admin']):
         parent = self.virtual['views']
     elif node == self.virtual['views']:
         parent = node.rootPackage
     else:
         parent = None
     return parent
示例#30
0
    def drag_received(self, widget, context, x, y, selection, targetType,
                      time):
        def create_and_open_view(sources):
            v = self.controller.create_static_view(elements=sources)
            p = get_edit_popup(v, controller=self.controller)
            self.add_view(p,
                          name=_("Edit %s") %
                          self.controller.get_title(v, max_size=40))
            # FIXME: put focus on edit window
            return True

        def edit_annotation(a):
            p = get_edit_popup(a, controller=self.controller)
            self.add_view(p,
                          name=_("Edit %s") %
                          self.controller.get_title(a, max_size=40))
            return True

        def edit_selection(sources):
            """Edit the selected elements in an edit accumulator.
            """
            v = self.controller.gui.open_adhoc_view('editaccumulator',
                                                    destination=self.location)
            if v is not None:
                for a in sources:
                    v.edit(a)
            return True

        if targetType == config.data.target_type['adhoc-view']:
            data = decode_drop_parameters(selection.data)
            label = None
            view = None
            if 'id' in data:
                # Saved parametered view. Get the view itself.
                ident = data['id']
                v = helper.get_id(self.controller.package.views, ident)
                # Get the view_id
                if v is None:
                    self.log(_("Cannot find the view %s") % ident)
                    return True
                name = v
                label = v.title
                view = self.controller.gui.open_adhoc_view(name,
                                                           label=label,
                                                           destination=None)
                if view is not None:
                    self.add_view(view, name=view.view_name)
            elif 'name' in data:
                name = data['name']
                if name == 'comment':
                    saved = [
                        v for v in self.controller.package.views
                        if helper.get_view_type(v) == 'static'
                        and v.matchFilter['class'] == 'package'
                        and not v.id.startswith('_')
                    ]
                else:
                    saved = [
                        v for v in self.controller.package.views
                        if v.content.mimetype ==
                        'application/x-advene-adhoc-view' and ET.parse(
                            v.content.stream).getroot().attrib['id'] == name
                    ]

                if name == 'transcription':
                    menu = gtk.Menu()
                    i = gtk.MenuItem(_("Open a new transcription for..."))
                    menu.append(i)
                    sm = gtk.Menu()
                    i.set_submenu(sm)
                    for at in self.controller.package.annotationTypes:
                        title = self.controller.get_title(at, max_size=40)
                        i = gtk.MenuItem(title, use_underline=False)
                        i.connect(
                            'activate', lambda i, s, t: self.controller.gui.
                            open_adhoc_view(name,
                                            source=s,
                                            label=t,
                                            destination=self.location),
                            "here/annotationTypes/%s/annotations/sorted" %
                            at.id, title)
                        sm.append(i)
                elif saved:
                    menu = gtk.Menu()
                    if name == 'comment':
                        i = gtk.MenuItem(_("Create a new comment view"))
                    else:
                        i = gtk.MenuItem(_("Open a new view"))
                    i.connect(
                        'activate',
                        lambda i: self.controller.gui.open_adhoc_view(
                            name, label=label, destination=self.location))
                    menu.append(i)
                else:
                    menu = None

                if menu is not None:
                    if saved:
                        i = gtk.MenuItem(_("Open a saved view"))
                        menu.append(i)
                        sm = gtk.Menu()
                        i.set_submenu(sm)
                        for v in saved:
                            i = gtk.MenuItem(v.title, use_underline=False)
                            if name == 'comment':
                                i.connect(
                                    'activate',
                                    lambda i, vv: self.controller.gui.
                                    open_adhoc_view('edit',
                                                    element=vv,
                                                    destination=self.location),
                                    v)
                            else:
                                i.connect(
                                    'activate',
                                    lambda i, vv: self.controller.gui.
                                    open_adhoc_view(vv,
                                                    label=vv.title,
                                                    destination=self.location),
                                    v)
                            sm.append(i)
                    menu.show_all()
                    menu.popup(None, None, None, 0,
                               gtk.get_current_event_time())
                else:
                    view = self.controller.gui.open_adhoc_view(
                        name, label=label, destination=None)
                    if view is not None:
                        self.add_view(view, name=view.view_name)
            else:
                # Bug
                self.log("Cannot happen")
                return True

            if 'master' in data and view is not None:
                # A master view has been specified. Connect it to
                # the created view.
                master = self.controller.gui.get_adhoc_view_instance_from_id(
                    data['master'])
                view.set_master_view(master)
            return True
        elif targetType == config.data.target_type['adhoc-view-instance']:
            v = self.controller.gui.get_adhoc_view_instance_from_id(
                selection.data)
            if v is not None:
                wid = v.widget
                self.add_view(v, name=v._label)
                if hasattr(v, 'reparent_done'):
                    v.reparent_done()
            else:
                print "Cannot find view ", selection.data
            return True
        elif targetType == config.data.target_type['view']:
            v = self.controller.package.views.get(
                unicode(selection.data, 'utf8'))
            if helper.get_view_type(v) in ('static', 'dynamic'):
                # Edit the view.
                self.controller.gui.open_adhoc_view('edit',
                                                    element=v,
                                                    destination=self.location)
            else:
                print "Unhandled case in viewbook: targetType=view"
            return True
        elif targetType == config.data.target_type['query']:
            v = self.controller.package.queries.get(
                unicode(selection.data, 'utf8'))
            if v is not None:
                self.controller.gui.open_adhoc_view('edit',
                                                    element=v,
                                                    destination=self.location)
            return True
        elif targetType == config.data.target_type['schema']:
            v = self.controller.package.schemas.get(
                unicode(selection.data, 'utf8'))
            if v is not None:
                self.controller.gui.open_adhoc_view('edit',
                                                    element=v,
                                                    destination=self.location)
            return True
        elif targetType == config.data.target_type['relation']:
            v = self.controller.package.relations.get(
                unicode(selection.data, 'utf8'))
            if v is not None:
                self.controller.gui.open_adhoc_view('edit',
                                                    element=v,
                                                    destination=self.location)
            return True
        elif targetType == config.data.target_type['annotation-type']:
            at = self.controller.package.annotationTypes.get(
                unicode(selection.data, 'utf8'))
            # Propose a menu to open various views for the annotation-type:
            menu = gtk.Menu()
            title = self.controller.get_title(at, max_size=40)
            i = gtk.MenuItem(_("Use annotation-type %s :") % title,
                             use_underline=False)
            menu.append(i)
            for label, action in (
                (_("to edit it"),
                 lambda i: self.controller.gui.open_adhoc_view(
                     'edit', element=at, destination=self.location)),
                (_("to create a new static view"),
                 lambda i: create_and_open_view([at])),
                (_("as a transcription"),
                 lambda i: self.controller.gui.open_adhoc_view(
                     'transcription',
                     source='here/annotationTypes/%s/annotations/sorted' % at.
                     id,
                     destination=self.location,
                     label=title)),
                (_("in a timeline"), lambda i: self.controller.gui.
                 open_adhoc_view('timeline',
                                 elements=at.annotations,
                                 annotationtypes=[at],
                                 destination=self.location,
                                 label=title)),
                (_("as a montage"), lambda i: self.controller.gui.
                 open_adhoc_view('montage',
                                 elements=at.annotations,
                                 destination=self.location,
                                 label=title)),
                (_("in a table"), lambda i: self.controller.gui.
                 open_adhoc_view('table',
                                 elements=at.annotations,
                                 destination=self.location,
                                 label=title)),
                (_("in a query"), lambda i: self.controller.gui.
                 open_adhoc_view('interactivequery',
                                 here=at,
                                 destination=self.location,
                                 label=_("Query %s") % title)),
                (_("in the TALES browser"), lambda i: self.controller.gui.
                 open_adhoc_view('browser',
                                 element=at,
                                 destination=self.location,
                                 label=_("Browsing %s") % title)),
            ):
                i = gtk.MenuItem(u"    " + label, use_underline=False)
                i.connect('activate', action)
                menu.append(i)
            menu.show_all()
            menu.popup(None, None, None, 0, gtk.get_current_event_time())
            return True
        elif targetType == config.data.target_type['annotation']:
            sources = [
                self.controller.package.annotations.get(uri)
                for uri in unicode(selection.data, 'utf8').split('\n')
            ]
            # Propose a menu to open various views for the annotation:
            menu = gtk.Menu()

            if len(sources) == 1:
                a = sources[0]
                title = self.controller.get_title(a, max_size=40)
                i = gtk.MenuItem(_("Use annotation %s :") % title,
                                 use_underline=False)
                menu.append(i)
                for label, action in (
                    (_("to edit it"), lambda i: edit_annotation(a)),
                    (_("to create a new static view"),
                     lambda i: create_and_open_view(sources)),
                    (_("in a query"), lambda i: self.controller.gui.
                     open_adhoc_view('interactivequery',
                                     here=a,
                                     destination=self.location,
                                     label=_("Query %s") % title)),
                    (_("in the TALES browser"), lambda i: self.controller.gui.
                     open_adhoc_view('browser',
                                     element=a,
                                     destination=self.location,
                                     label=_("Browse %s") % title)),
                    (_("to display its contents"), lambda i: self.controller.
                     gui.open_adhoc_view('annotationdisplay',
                                         annotation=a,
                                         destination=self.location,
                                         label=_("%s") % title)),
                    (_("as a bookmark"), lambda i: self.controller.gui.
                     open_adhoc_view('activebookmarks',
                                     elements=[a.fragment.begin],
                                     destination=self.location)),
                ):
                    i = gtk.MenuItem(u"    " + label, use_underline=False)
                    i.connect('activate', action)
                    menu.append(i)

                def apply_query(m, q):
                    ctx = self.controller.build_context(here=a)
                    res, qexpr = self.controller.evaluate_query(q, context=ctx)
                    self.controller.gui.open_adhoc_view(
                        'interactiveresult',
                        query=q,
                        result=res,
                        destination=self.location)
                    return True

                if self.controller.package.queries:
                    sm = gtk.Menu()
                    for q in self.controller.package.queries:
                        i = gtk.MenuItem(self.controller.get_title(
                            q, max_size=40),
                                         use_underline=False)
                        i.connect('activate', apply_query, q)
                        sm.append(i)
                    i = gtk.MenuItem(u"    " +
                                     _("as the context for the query..."),
                                     use_underline=False)
                    i.set_submenu(sm)
                    menu.append(i)
            else:
                title = _("Set of annotations")
                i = gtk.MenuItem(_("Use annotations:"), use_underline=False)
                menu.append(i)
                for label, action in (
                    (_("to edit them"), lambda i: edit_selection(sources)),
                    (_("in a table"), lambda i: self.controller.gui.
                     open_adhoc_view('table', elements=sources)),
                    (_("to create a new static view"),
                     lambda i: create_and_open_view(sources)),
                    (_("as bookmarks"),
                     lambda i: self.controller.gui.open_adhoc_view(
                         'activebookmarks',
                         elements=[a.fragment.begin for a in sources],
                         destination=self.location)),
                ):
                    i = gtk.MenuItem(u"    " + label, use_underline=False)
                    i.connect('activate', action)
                    menu.append(i)
            menu.show_all()
            menu.popup(None, None, None, 0, gtk.get_current_event_time())
            return True
        elif targetType == config.data.target_type['timestamp']:
            data = decode_drop_parameters(selection.data)
            v = self.controller.gui.open_adhoc_view('activebookmarks',
                                                    destination=self.location)
            v.append(long(data['timestamp']), comment=data.get('comment', ''))
            return True
        else:
            print "Unknown drag target received ", targetType
        return False
示例#31
0
 def nodeChildren(self, node):
     #logger.warning("nodechildren %s %s", type(node), node)
     children = []
     if isinstance(node, Annotation):
         children = []
     elif isinstance(node, Relation):
         children = []
     elif isinstance(node, AnnotationType):
         if not node in self.childrencache:
             self.childrencache[node] = node.annotations
         children = self.childrencache[node]
     elif isinstance(node, RelationType):
         if not node in self.childrencache:
             self.childrencache[node] = node.relations
         children = self.childrencache[node]
     elif isinstance(node, Schema):
         # Do not cache these elements
         l = list(node.annotationTypes)
         l.extend(node.relationTypes)
         children = l
     elif isinstance(node, View):
         children = []
     elif isinstance(node, Query):
         children = []
     elif isinstance(node, Package):
         if not node in self.childrencache:
             self.childrencache[node] = [
                 node.schemas, self.virtual['views'], node.queries,
                 node.resources or _("No resources")
             ]
         children = self.childrencache[node]
     elif isinstance(node, AbstractBundle):
         children = node
     elif isinstance(node, Resources):
         if not node in self.childrencache:
             self.childrencache[node] = node.children()
         children = self.childrencache[node]
     elif isinstance(node, ResourceData):
         children = []
     elif node == self.virtual['views']:
         children = [
             self.virtual['static'], self.virtual['dynamic'],
             self.virtual['adhoc'], self.virtual['admin']
         ]
     elif isinstance(node, list) and len(node) == 0:
         children = [self.get_package()]
     else:
         children = []
         if node == self.virtual['admin']:
             children = sorted([
                 v for v in node.rootPackage.views if v.id.startswith('_')
             ],
                               key=lambda e: (e.title or e.id).lower())
         else:
             for t in ('static', 'dynamic', 'adhoc'):
                 if node == self.virtual[t]:
                     children = sorted([
                         v for v in node.rootPackage.views
                         if not v.id.startswith('_')
                         and helper.get_view_type(v) == t
                     ],
                                       key=lambda e:
                                       (e.title or e.id).lower())
                     break
     return children
示例#32
0
文件: finder.py 项目: oaubert/advene2
 def children(self):
     yield ListNode( [ v for v in self.element if helper.get_view_type(v) == 'static' and not v.id.startswith('_') and not v.id.startswith(':') ], _("Static views"))
     yield ListNode( [ v for v in self.element if helper.get_view_type(v) == 'dynamic' and not v.id.startswith('_') ], _("Dynamic views"))
     yield ListNode( [ v for v in self.element if helper.get_view_type(v) == 'adhoc' and not v.id.startswith('_') ], _("Adhoc views"))
     yield ListNode( [ v for v in self.element if v.id.startswith('_') ], _("Admin views"))
     yield ListNode( [ v for v in self.element if helper.get_view_type(v) == 'static' and v.id.startswith(':')], _("Constraint views"))
示例#33
0
文件: actions.py 项目: oaubert/advene
 def ActivateSTBV_predefined(self, controller):
     """Return the predefined values.
     """
     return { 'viewid': [ ('string:%s' % v.id, controller.get_title(v))
                          for v in controller.package.views
                          if helper.get_view_type(v) == 'dynamic' ] }
示例#34
0
def drag_data_get_cb(widget, context, selection, targetType, timestamp, controller):
    """Generic drag-data-get handler.

    It is used by the origin widget of a drag action, when the
    destination widget queries for the DND data.

    Usage information:
    this method must be connected passing the controller as user data:
      widget.connect('drag-data-get', drag_data_get_cb, controller)

    and the context must have a _element attribute (defined in a
    'drag-begin' handler for instance).
    """
    typ=config.data.target_type
    el = context._element
    # FIXME: think about the generalisation of the notion of container
    # selection (for timestamp lists for instance)
    widgets = None
    try:
        c = widget.container
    except  (AttributeError, RuntimeError):
        # No container. Note that getattr(widget, 'container', None)
        # would anyway raise a RuntimeError (container is some kind of
        # reserved in gtk).
        c = None
    if c:
        try:
            widgets = c.get_selected_annotation_widgets()
            if not widget in widgets:
                widgets = None
        except AttributeError:
            logger.error("Cannot get_selected_annotation_widgets", exc_info=True)

    d={ typ['annotation']: Annotation,
        typ['annotation-type']: AnnotationType,
        typ['relation']: Relation,
        typ['relation-type']: RelationType,
        typ['view']: View,
        typ['query']: Query,
        typ['schema']: Schema }
    if targetType in d:
        # Directly pass URIs for Annotation, types and views
        if not isinstance(el, d[targetType]):
            return False
        if widgets:
            selection.set(selection.get_target(), 8, "\n".join( w.annotation.uri for w in widgets ).encode('utf8'))
        else:
            selection.set(selection.get_target(), 8, el.uri.encode('utf8'))
        return True
    elif targetType == typ['adhoc-view']:
        if helper.get_view_type(el) != 'adhoc':
            return False
        selection.set(selection.get_target(), 8, encode_drop_parameters(id=el.id))
        return True
    elif targetType == typ['uri-list']:

        if widgets:
            selection.set(selection.get_target(), 8, "\n".join( controller.build_context(here=w.annotation).evaluateValue('here/absolute_url') for w in widgets ).encode('utf8'))
        else:
            try:
                uri=controller.build_context(here=el).evaluateValue('here/absolute_url')
            except:
                uri="No URI for " + str(el)
            selection.set(selection.get_target(), 8, uri.encode('utf8'))
    elif targetType == typ['timestamp']:
        if isinstance(el, int):
            selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=el))
        elif isinstance(el, Annotation):
            selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=el.fragment.begin,
                                                                      comment=controller.get_title(el)))
        else:
            logger.error("Inconsistent DND target %s", targetType)
        return True
    elif targetType in (typ['text-plain'], typ['STRING']):
        selection.set(selection.get_target(), 8, controller.get_title(el).encode('utf8'))
    else:
        logger.warn("Unknown target type for drag: %d" % targetType)
    return True
示例#35
0
    def drag_received(self, widget, context, x, y, selection, targetType, time):
        def create_and_open_view(sources):
            v=self.controller.create_static_view(elements=sources)
            p=get_edit_popup(v, controller=self.controller)
            self.add_view(p, name=_("Edit %s") % self.controller.get_title(v, max_size=40))
            # FIXME: put focus on edit window
            return True

        def edit_annotation(a):
            p=get_edit_popup(a, controller=self.controller)
            self.add_view(p, name=_("Edit %s") % self.controller.get_title(a, max_size=40))
            return True

        def edit_selection(sources):
            """Edit the selected elements in an edit accumulator.
            """
            v=self.controller.gui.open_adhoc_view('editaccumulator',
                                                  destination=self.location)
            if v is not None:
                for a in sources:
                    v.edit(a)
            return True

        if targetType == config.data.target_type['adhoc-view']:
            data=decode_drop_parameters(selection.data)
            label=None
            view=None
            if 'id' in data:
                # Saved parametered view. Get the view itself.
                ident=data['id']
                v=self.controller.package.get(ident)
                # Get the view_id
                if v is None:
                    self.log(_("Cannot find the view %s") % ident)
                    return True
                name=v
                label=v.title
                view=self.controller.gui.open_adhoc_view(name, label=label, destination=None)
                self.add_view(view, name=view.view_name)
            elif 'name' in data:
                name=data['name']
                def stbv_name(v):
                    f=v.content.as_file
                    try:
                        n=ET.parse(f).getroot().attrib.get('id')
                    except:
                        n=None
                    f.close()
                    return n
                saved=[ v
                        for v in self.controller.package.all.views
                        if v.content.mimetype == 'application/x-advene-adhoc-view'
                        and stbv_name(v) == name ]
                if name == 'transcription':
                    menu=gtk.Menu()
                    i=gtk.MenuItem(_("Open a new transcription for..."))
                    menu.append(i)
                    sm=gtk.Menu()
                    i.set_submenu(sm)
                    for at in self.controller.package.all.annotation_types:
                        title=self.controller.get_title(at)
                        i=gtk.MenuItem(title, use_underline=False)
                        i.connect('activate', lambda i, s, t: self.controller.gui.open_adhoc_view(name, source=s, label=t, destination=self.location), "here/all/annotation_types/%s/annotations/sorted" % at.id, title)
                        sm.append(i)
                elif saved:
                    menu=gtk.Menu()
                    if name == 'comment':
                        i=gtk.MenuItem(_("Create a new comment view"))
                    else:
                        i=gtk.MenuItem(_("Open a new view"))
                    i.connect('activate', lambda i: self.controller.gui.open_adhoc_view(name, label=label, destination=self.location))
                    menu.append(i)
                else:
                    menu=None

                if menu is not None:
                    if saved:
                        i=gtk.MenuItem(_("Open a saved view"))
                        menu.append(i)
                        sm=gtk.Menu()
                        i.set_submenu(sm)
                        for v in saved:
                            i=gtk.MenuItem(v.title, use_underline=False)
                            if name == 'comment':
                                i.connect('activate', lambda i, vv: self.controller.gui.open_adhoc_view('edit', element=vv, destination=self.location), v)
                            else:
                                i.connect('activate', lambda i, vv: self.controller.gui.open_adhoc_view(vv, label=vv.title, destination=self.location), v)
                            sm.append(i)
                    menu.show_all()
                    menu.popup(None, None, None, 0, gtk.get_current_event_time())
                else:
                    view=self.controller.gui.open_adhoc_view(name, label=label, destination=None)
                    if view is not None:
                        self.add_view(view, name=view.view_name)
            else:
                # Bug
                self.log("Cannot happen")
                return True


            if 'master' in data and view is not None:
                # A master view has been specified. Connect it to
                # the created view.
                master=self.controller.gui.get_adhoc_view_instance_from_id(data['master'])
                view.set_master_view(master)
            return True
        elif targetType == config.data.target_type['adhoc-view-instance']:
            v=self.controller.gui.get_adhoc_view_instance_from_id(selection.data)
            if v is not None:
                wid=v.widget
                self.add_view(v, name=v._label)
                if hasattr(v, 'reparent_done'):
                    v.reparent_done()
            else:
                print "Cannot find view ", selection.data
            return True
        elif targetType == config.data.target_type['view']:
            v=self.controller.package.views.get(unicode(selection.data, 'utf8'))
            if helper.get_view_type(v) in ('static', 'dynamic'):
                # Edit the view.
                self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
            else:
                print "Unhandled case in viewbook: targetType=view"
            return True
        elif targetType == config.data.target_type['query']:
            v=self.controller.package.queries.get(unicode(selection.data, 'utf8'))
            if v is not None:
                self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
            return True
        elif targetType == config.data.target_type['schema']:
            v=self.controller.package.get(unicode(selection.data, 'utf8'))
            if v is not None:
                self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
            return True
        elif targetType == config.data.target_type['relation']:
            v=self.controller.package.relations.get(unicode(selection.data, 'utf8'))
            if v is not None:
                self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
            return True
        elif targetType == config.data.target_type['annotation-type']:
            at=self.controller.package.get(unicode(selection.data, 'utf8'))
            # Propose a menu to open various views for the annotation-type:
            menu=gtk.Menu()
            title=self.controller.get_title(at, max_size=40)
            i=gtk.MenuItem(_("Use annotation-type %s :") % title, use_underline=False)
            menu.append(i)
            for label, action in (
                (_("to edit it"), lambda i :self.controller.gui.open_adhoc_view('edit', element=at, destination=self.location)),
                (_("to create a new static view"), lambda i: create_and_open_view([ at ])),
                (_("as a transcription"), lambda i: self.controller.gui.open_adhoc_view('transcription', source='here/annotation_types/%s/annotations' % at.id, destination=self.location, label=title)),
                (_("in a timeline"), lambda i: self.controller.gui.open_adhoc_view('timeline', elements=at.annotations, annotationtypes=[ at ], destination=self.location, label=title)),
                (_("as a montage"), lambda i: self.controller.gui.open_adhoc_view('montage', elements=at.annotations, destination=self.location, label=title)),
                (_("in a table"), lambda i: self.controller.gui.open_adhoc_view('table', elements=at.annotations, destination=self.location, label=title)),
                (_("in a query"), lambda i: self.controller.gui.open_adhoc_view('interactivequery', here=at, destination=self.location, label=_("Query %s") % title)),
                (_("in the TALES browser"), lambda i: self.controller.gui.open_adhoc_view('browser', element=at, destination=self.location, label=_("Browsing %s") % title)),
                ):
                i=gtk.MenuItem(u"    " + label, use_underline=False)
                i.connect('activate', action)
                menu.append(i)
            menu.show_all()
            menu.popup(None, None, None, 0, gtk.get_current_event_time())
            return True
        elif targetType == config.data.target_type['annotation']:
            sources=[ self.controller.package.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
            # Propose a menu to open various views for the annotation:
            menu=gtk.Menu()

            if len(sources) == 1:
                a=sources[0]
                title=self.controller.get_title(a, max_size=40)
                i=gtk.MenuItem(_("Use annotation %s :") % title, use_underline=False)
                menu.append(i)
                for label, action in (
                    (_("to edit it"), lambda i: edit_annotation(a)),
                    (_("to create a new static view"), lambda i: create_and_open_view(sources)),
                    (_("in a query"), lambda i: self.controller.gui.open_adhoc_view('interactivequery', here=a, destination=self.location, label=_("Query %s") % title)),
                    (_("in the TALES browser"), lambda i: self.controller.gui.open_adhoc_view('browser', element=a, destination=self.location, label=_("Browse %s") % title)),
                    (_("to display its contents"), lambda i: self.controller.gui.open_adhoc_view('annotationdisplay', annotation=a, destination=self.location, label=_("%s") % title)) ,
                    (_("as a bookmark"), lambda i: self.controller.gui.open_adhoc_view('activebookmarks', elements=[ a.begin ], destination=self.location)),
                    ):
                    i=gtk.MenuItem(u"    " + label, use_underline=False)
                    i.connect('activate', action)
                    menu.append(i)

                def apply_query(m, q):
                    ctx=self.controller.build_context(here=a)
                    res, qexpr=self.controller.evaluate_query(q, context=ctx)
                    self.controller.gui.open_adhoc_view('interactiveresult', query=q, result=res, destination=self.location)
                    return True

                if self.controller.package.all.queries:
                    sm=gtk.Menu()
                    for q in self.controller.package.queries:
                        i=gtk.MenuItem(self.controller.get_title(q, max_size=40), use_underline=False)
                        i.connect('activate', apply_query, q)
                        sm.append(i)
                    i=gtk.MenuItem(u"    " + _("as the context for the query..."), use_underline=False)
                    i.set_submenu(sm)
                    menu.append(i)
            else:
                title=_("Set of annotations")
                i=gtk.MenuItem(_("Use annotations:"), use_underline=False)
                menu.append(i)
                for label, action in (
                    (_("to edit them"), lambda i: edit_selection(sources)),
                    (_("in a table"), lambda i: self.controller.gui.open_adhoc_view('table', elements=sources)),
                    (_("to create a new static view"), lambda i: create_and_open_view(sources)),
                    (_("as bookmarks"), lambda i: self.controller.gui.open_adhoc_view('activebookmarks', elements=[ a.begin for a in sources ], destination=self.location)),
                    ):
                    i=gtk.MenuItem(u"    " + label, use_underline=False)
                    i.connect('activate', action)
                    menu.append(i)
            menu.show_all()
            menu.popup(None, None, None, 0, gtk.get_current_event_time())
            return True
        elif targetType == config.data.target_type['timestamp']:
            data=decode_drop_parameters(selection.data)
            v=self.controller.gui.open_adhoc_view('activebookmarks', destination=self.location)
            v.append(long(data['timestamp']), comment=data.get('comment', ''))
            return True
        else:
            print "Unknown drag target received ", targetType
        return False
示例#36
0
def drag_data_get_cb(widget, context, selection, targetType, timestamp, controller):
    """Generic drag-data-get handler.

    It is used by the origin widget of a drag action, when the
    destination widget queries for the DND data.

    Usage information:
    this method must be connected passing the controller as user data:
      widget.connect('drag-data-get', drag_data_get_cb, controller)

    and the context must have a _element attribute (defined in a
    'drag-begin' handler for instance).
    """
    typ=config.data.target_type
    el = context._element
    # FIXME: think about the generalisation of the notion of container
    # selection (for timestamp lists for instance)
    widgets = None
    try:
        c = widget.container
    except  (AttributeError, RuntimeError):
        # No container. Note that getattr(widget, 'container', None)
        # would anyway raise a RuntimeError (container is some kind of
        # reserved in gtk).
        c = None
    if c:
        try:
            widgets = c.get_selected_annotation_widgets()
            if not widget in widgets:
                widgets = None
        except AttributeError:
            logger.error("Cannot get_selected_annotation_widgets", exc_info=True)

    d={ typ['annotation']: Annotation,
        typ['annotation-type']: AnnotationType,
        typ['relation']: Relation,
        typ['relation-type']: RelationType,
        typ['view']: View,
        typ['query']: Query,
        typ['schema']: Schema }
    if targetType in d:
        # Directly pass URIs for Annotation, types and views
        if not isinstance(el, d[targetType]):
            return False
        if widgets:
            selection.set(selection.get_target(), 8, "\n".join( w.annotation.uri for w in widgets ).encode('utf8'))
        else:
            selection.set(selection.get_target(), 8, el.uri.encode('utf8'))
        return True
    elif targetType == typ['adhoc-view']:
        if helper.get_view_type(el) != 'adhoc':
            return False
        selection.set(selection.get_target(), 8, encode_drop_parameters(id=el.id))
        return True
    elif targetType == typ['uri-list']:

        if widgets:
            selection.set(selection.get_target(), 8, "\n".join( controller.build_context(here=w.annotation).evaluateValue('here/absolute_url') for w in widgets ).encode('utf8'))
        else:
            try:
                uri=controller.build_context(here=el).evaluateValue('here/absolute_url')
            except:
                uri="No URI for " + str(el)
            selection.set(selection.get_target(), 8, uri.encode('utf8'))
    elif targetType == typ['timestamp']:
        if isinstance(el, int):
            selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=el))
        elif isinstance(el, Annotation):
            selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=el.fragment.begin,
                                                                            comment=controller.get_title(el)))
        else:
            logger.error("Inconsistent DND target %s", targetType)
        return True
    elif targetType in (typ['text-plain'], typ['STRING']):
        selection.set(selection.get_target(), 8, controller.get_title(el).encode('utf8'))
    else:
        logger.warning("Unknown target type for drag: %d", targetType)
    return True
示例#37
0
def drag_data_get_cb(widget, context, selection, targetType, timestamp, controller):
    """Generic drag-data-get handler.

    Usage information:
    this method must be connected passing the controller as user data:
      widget.connect('drag-data-get', drag_data_get_cb, controller)

    and the context must has a _element attribute (defined in a
    'drag-begin' handler for instance).
    """
    typ=config.data.target_type
    el = context._element
    # FIXME: think about the generalisation of the notion of container
    # selection (for timestamp lists for instance)
    try:
        widgets = widget.container.get_selected_annotation_widgets()
        if not widget in widgets:
            widgets = None
    except AttributeError:
        widgets=None


    d={ typ['annotation']: Annotation,
        typ['annotation-type']: AnnotationType,
        typ['relation']: Relation,
        typ['relation-type']: RelationType,
        typ['view']: View,
        typ['query']: Query,
        typ['schema']: Schema }
    if targetType in d:
        # Directly pass URIs for Annotation, types and views
        if not isinstance(el, d[targetType]):
            return False
        if widgets:
            selection.set(selection.target, 8, "\n".join( w.annotation.uriref for w in widgets ).encode('utf8'))
        else:
            selection.set(selection.target, 8, el.uriref.encode('utf8'))
        return True
    elif targetType == typ['adhoc-view']:
        if helper.get_view_type(el) != 'adhoc':
            return False
        selection.set(selection.target, 8, encode_drop_parameters(id=el.id))
        return True
    elif targetType == typ['uri-list']:

        if widgets:
            selection.set(selection.target, 8, "\n".join( controller.build_context(here=w.annotation).evaluate('here/absolute_url') for w in widgets ).encode('utf8'))
        else:
            try:
                uri=controller.build_context(here=el).evaluate('here/absolute_url')
            except:
                uri="No URI for " + unicode(el)
            selection.set(selection.target, 8, uri.encode('utf8'))
    elif targetType == typ['timestamp']:
        if isinstance(el, (int, long)):
            selection.set(selection.target, 8, encode_drop_parameters(timestamp=el))
        elif isinstance(el, Annotation):
            selection.set(selection.target, 8, encode_drop_parameters(timestamp=el.begin,
                                                                      comment=controller.get_title(el)))
        else:
            print "Inconsistent DND target"
        return True
    elif targetType in (typ['text-plain'], typ['STRING']):
        selection.set(selection.target, 8, controller.get_title(el).encode('utf8'))
    else:
        print "Unknown target type for drag: %d" % targetType
    return True
示例#38
0
def drag_data_get_cb(widget, context, selection, targetType, timestamp,
                     controller):
    """Generic drag-data-get handler.

    Usage information:
    this method must be connected passing the controller as user data:
      widget.connect('drag-data-get', drag_data_get_cb, controller)

    and the context must has a _element attribute (defined in a
    'drag-begin' handler for instance).
    """
    typ = config.data.target_type
    el = context._element
    # FIXME: think about the generalisation of the notion of container
    # selection (for timestamp lists for instance)
    try:
        widgets = widget.container.get_selected_annotation_widgets()
        if not widget in widgets:
            widgets = None
    except AttributeError:
        widgets = None

    d = {
        typ['annotation']: Annotation,
        typ['annotation-type']: AnnotationType,
        typ['relation']: Relation,
        typ['relation-type']: RelationType,
        typ['view']: View,
        typ['query']: Query,
        typ['schema']: Schema
    }
    if targetType in d:
        # Directly pass URIs for Annotation, types and views
        if not isinstance(el, d[targetType]):
            return False
        if widgets:
            selection.set(
                selection.target, 8,
                "\n".join(w.annotation.uri for w in widgets).encode('utf8'))
        else:
            selection.set(selection.target, 8, el.uri.encode('utf8'))
        return True
    elif targetType == typ['adhoc-view']:
        if helper.get_view_type(el) != 'adhoc':
            return False
        selection.set(selection.target, 8, encode_drop_parameters(id=el.id))
        return True
    elif targetType == typ['uri-list']:

        if widgets:
            selection.set(
                selection.target, 8, "\n".join(
                    controller.build_context(here=w.annotation.uri).
                    evaluateValue('here/absolute_url')
                    for w in widgets).encode('utf8'))
        else:
            try:
                uri = controller.build_context(
                    here=el).evaluateValue('here/absolute_url')
            except:
                uri = "No URI for " + unicode(el)
            selection.set(selection.target, 8, uri.encode('utf8'))
    elif targetType == typ['timestamp']:
        if isinstance(el, (int, long)):
            selection.set(selection.target, 8,
                          encode_drop_parameters(timestamp=el))
        elif isinstance(el, Annotation):
            selection.set(
                selection.target, 8,
                encode_drop_parameters(timestamp=el.fragment.begin,
                                       comment=controller.get_title(el)))
        else:
            print "Inconsistent DND target"
        return True
    elif targetType in (typ['text-plain'], typ['STRING']):
        selection.set(selection.target, 8,
                      controller.get_title(el).encode('utf8'))
    else:
        print "Unknown target type for drag: %d" % targetType
    return True