Ejemplo n.º 1
0
    def create_dynamic_view(self, at):
        """Create a caption dynamic view for the given annotation-type.
        """
        p=self.controller.package
        ident='v_caption_%s' % at.id
        if p.get(ident) is not None:
            dialog.message_dialog(_("A caption dynamic view for %s already seems to exist.") % self.get_title(at))
            return True
        v=p.create_view(id=ident,
                        mimetype='application/x-advene-ruleset')
        v.title=_("Caption %s annotations") % self.controller.get_title(at)

        # Build the ruleset
        r=RuleSet()
        catalog=self.controller.event_handler.catalog

        ra=catalog.get_action("AnnotationCaption")
        action=Action(registeredaction=ra, catalog=catalog)
        action.add_parameter('message', 'annotation/content/data')

        rule=Rule(name=_("Caption the annotation"),
                  event=Event("AnnotationBegin"),
                  condition=Condition(lhs='annotation/type/id',
                                      operator='equals',
                                      rhs='string:%s' % at.id),
                  action=action)
        r.add_rule(rule)

        v.content.data=r.xml_repr()

        p.views.append(v)
        self.controller.notify('ViewCreate', view=v)
        self.controller.activate_stbv(v)
        return True
Ejemplo n.º 2
0
 def update_value(self):
     if not self.editable:
         return False
     ra = self.catalog.get_action(self.current_name)
     self.model = Action(registeredaction=ra, catalog=self.catalog)
     regexp = re.compile('^(\(.+\)|)$')
     for n, v in self.current_parameters.items():
         # We ignore parameters fields that are empty or that match '^\(.+\)$'
         if not regexp.match(v):
             self.model.add_parameter(n, v)
     return True
Ejemplo n.º 3
0
 def add_rule_cb(button=None):
     if not self.editable:
         return True
     # Create a new default Rule
     event=Event("AnnotationBegin")
     ra=self.catalog.get_action("Message")
     action=Action(registeredaction=ra, catalog=self.catalog)
     for p in ra.parameters:
         action.add_parameter(p, ra.defaults.get(p, ''))
     # Find the next rulename index
     l=[ int(i) for i in re.findall(unicode(_('Rule')+'\s*(\d+)'), ''.join(r.name for r in self.model)) ]
     idx=max(l or [ 0 ] ) + 1
     rule=Rule(name=_("Rule") + str(idx),
               event=event,
               action=action)
     self.add_rule(rule)
     return True
Ejemplo n.º 4
0
 def add_rule_cb(button=None):
     if not self.editable:
         return True
     # Create a new default Rule
     event=Event("AnnotationBegin")
     ra=self.catalog.get_action("Message")
     action=Action(registeredaction=ra, catalog=self.catalog)
     for p in ra.parameters:
         action.add_parameter(p, ra.defaults.get(p, ''))
     # Find the next rulename index
     l=[ int(i) for i in re.findall(_('Rule')+r'\s*(\d+)', ''.join(r.name for r in self.model)) ]
     idx=max(l or [ 0 ] ) + 1
     rule=Rule(name=_("Rule") + str(idx),
               event=event,
               action=action)
     self.add_rule(rule)
     return True
Ejemplo n.º 5
0
 def update_value(self):
     if not self.editable:
         return False
     ra=self.catalog.get_action(self.current_name)
     self.model = Action(registeredaction=ra, catalog=self.catalog)
     regexp=re.compile('^(\(.+\)|)$')
     for n, v in self.current_parameters.items():
         # We ignore parameters fields that are empty or that match '^\(.+\)$'
         if not regexp.match(v):
             self.model.add_parameter(n, v)
     return True
Ejemplo n.º 6
0
    def create_follow_dynamic_view(self, rt):
        """Create a dynamic view for the given relation-type.
        """
        p = self.controller.package
        ident = 'v_follow_%s' % rt.id
        if p.get_element_by_id(ident) is not None:
            dialog.message_dialog(
                _("A follow dynamic view for %s already seems to exist.") %
                self.get_title(rt))
            return True
        v = p.createView(ident=ident,
                         author=config.data.userid,
                         date=self.controller.get_timestamp(),
                         clazz='package',
                         content_mimetype='application/x-advene-ruleset')
        v.title = _("Follow %s relation-type") % self.get_title(rt)

        # Build the ruleset
        r = RuleSet()
        catalog = self.controller.event_handler.catalog

        ra = catalog.get_action("PlayerGoto")
        action = Action(registeredaction=ra, catalog=catalog)
        action.add_parameter(
            'position',
            'annotation/typedRelatedOut/%s/first/fragment/begin' % rt.id)
        rule = Rule(name=_("Follow the relation"),
                    event=Event("AnnotationEnd"),
                    condition=Condition(lhs='annotation/typedRelatedOut/%s' %
                                        rt.id,
                                        operator='value'),
                    action=action)
        r.add_rule(rule)

        v.content.data = r.xml_repr()

        p.views.append(v)
        self.controller.notify('ViewCreate', view=v)
        self.controller.activate_stbv(v)
        return True
Ejemplo n.º 7
0
    def create_dynamic_view(self, at):
        """Create a caption dynamic view for the given annotation-type.
        """
        p = self.controller.package
        ident = 'v_caption_%s' % at.id
        if p.get_element_by_id(ident) is not None:
            dialog.message_dialog(
                _("A caption dynamic view for %s already seems to exist.") %
                self.get_title(at))
            return True
        v = p.createView(ident=ident,
                         author=config.data.userid,
                         date=self.controller.get_timestamp(),
                         clazz='package',
                         content_mimetype='application/x-advene-ruleset')
        v.title = _("Caption %s annotations") % self.get_title(at)

        # Build the ruleset
        r = RuleSet()
        catalog = self.controller.event_handler.catalog

        ra = catalog.get_action("AnnotationCaption")
        action = Action(registeredaction=ra, catalog=catalog)
        action.add_parameter('message', 'annotation/content/data')

        rule = Rule(name=_("Caption the annotation"),
                    event=Event("AnnotationBegin"),
                    condition=Condition(lhs='annotation/type/id',
                                        operator='equals',
                                        rhs='string:%s' % at.id),
                    action=action)
        r.add_rule(rule)

        v.content.data = r.xml_repr()

        p.views.append(v)
        self.controller.notify('ViewCreate', view=v)
        self.controller.activate_stbv(v)
        return True
Ejemplo n.º 8
0
    def create_follow_dynamic_view(self, rt):
        """Create a dynamic view for the given relation-type.
        """
        p = self.controller.package
        ident = 'v_follow_%s' % rt.id
        if p.get_element_by_id(ident) is not None:
            dialog.message_dialog(_("A follow dynamic view for %s already seems to exist.") % self.get_title(rt))
            return True
        v = p.createView(
            ident=ident,
            author=config.data.userid,
            date=self.controller.get_timestamp(),
            clazz='package',
            content_mimetype='application/x-advene-ruleset'
            )
        v.title = _("Follow %s relation-type") % self.get_title(rt)

        # Build the ruleset
        r = RuleSet()
        catalog = self.controller.event_handler.catalog

        ra = catalog.get_action("PlayerGoto")
        action = Action(registeredaction=ra, catalog=catalog)
        action.add_parameter('position', 'annotation/typedRelatedOut/%s/first/fragment/begin' % rt.id)
        rule=Rule(name=_("Follow the relation"),
                  event=Event("AnnotationEnd"),
                  condition=Condition(lhs='annotation/typedRelatedOut/%s' % rt.id,
                                      operator='value'),
                  action=action)
        r.add_rule(rule)

        v.content.data=r.xml_repr()

        p.views.append(v)
        self.controller.notify('ViewCreate', view=v)
        self.controller.activate_stbv(v)
        return True
Ejemplo n.º 9
0
class EditAction(EditGeneric):
    def __init__(self, action, catalog, editable=True, controller=None):
        self.model=action

        self.editable=editable
        self.current_name=action.name
        self.current_parameters=dict(action.parameters)
        # RegisteredAction matching the self.current_name
        self.registeredaction=catalog.get_action(self.current_name)

        self.controller=controller

        # Cache the parameters value. Indexed by action name.
        # Used when using the mousewheel on the action name list:
        # it should keep the parameters values
        self.cached_parameters={}

        # Dict of parameter widgets (modified when the action name changes)
        # indexed by parameter name.
        self.paramlist={}

        self.catalog=catalog
        self.widget=self.build_widget()

    def invalid_items(self):
        iv=[ _("Parameter %s") % n
             for n in self.paramlist
             if not self.paramlist[n].entry.is_valid() ]
        return iv

    def update_value(self):
        if not self.editable:
            return False
        ra=self.catalog.get_action(self.current_name)
        self.model = Action(registeredaction=ra, catalog=self.catalog)
        regexp=re.compile('^(\(.+\)|)$')
        for n, v in self.current_parameters.iteritems():
            # We ignore parameters fields that are empty or that match '^\(.+\)$'
            if not regexp.match(v):
                #print "Updating %s = %s" % (n, v)
                self.model.add_parameter(n, v)
        return True

    def sorted(self, l):
        """Return a sorted version of the list."""
        if isinstance(l, dict):
            res=l.keys()
        else:
            res=l[:]
        res.sort()
        return res

    def on_change_name(self, element):
        if element.name == self.current_name:
            return True
        # Cache the old parameters values
        self.cached_parameters[self.current_name]=self.current_parameters.copy()

        self.current_name=element.name
        for w in self.paramlist.values():
            w.destroy()
        self.paramlist={}

        ra=self.catalog.get_action(self.current_name)
        self.registeredaction=ra
        if self.current_name in self.cached_parameters:
            self.current_parameters=self.cached_parameters[self.current_name]
        else:
            self.current_parameters={}.fromkeys(ra.parameters, "")

        for name in self.sorted(self.current_parameters):
            v=ra.default_value(name)
            p=self.build_parameter_widget(name,
                                          v,
                                          ra.describe_parameter(name))
            self.current_parameters[name]=v
            self.paramlist[name]=p
            p.show()
            self.widget.add(p)

        return True

    def on_change_parameter(self, entry, talesentry, name):
        value=unicode(talesentry.get_text())
        self.current_parameters[name]=value
        return True

    def build_parameter_widget(self, name, value, description):
        hbox=gtk.HBox()
        label=gtk.Label(name)
        hbox.pack_start(label, expand=False)

        ra=self.registeredaction
        if ra:
            # Get predefined values
            if callable(ra.predefined):
                predefined=ra.predefined(self.controller)[name]
            elif ra.predefined is not None:
                predefined=ra.predefined[name]
            else:
                predefined=None

        entry=TALESEntry(controller=self.controller, predefined=predefined)
        entry.set_text(value)
        entry.set_editable(self.editable)
        entry.entry.connect('changed', self.on_change_parameter, entry, name)

        entry.entry.set_tooltip_text(description)

        hbox.entry=entry

        hbox.pack_start(entry.widget)
        hbox.show_all()
        return hbox

    def build_widget(self):
        vbox=gtk.VBox()

        vbox.add(gtk.HSeparator())

        def description_getter(element):
            if hasattr(element, 'description'):
                return element.description
            else:
                # it is a category
                return self.catalog.action_categories[element]

        c=self.catalog
        def expert_filter(l, attr=None):
            if config.data.preferences['expert-mode']:
                return l
            else:
                expert_categories = ('expert', 'gui', 'state')
                if attr is None:
                    # No attribute, directly test value
                    return [ e for e in l if not e in expert_categories ]
                else:
                    return [ e for e in l if not getattr(e, attr) in expert_categories ]

        self.selector=dialog.CategorizedSelector(title=_("Select an action"),
                                                 elements=expert_filter(sorted(c.actions.values()), 'category'),
                                                 categories=expert_filter(c.action_categories.keys()),
                                                 current=c.actions[self.current_name],
                                                 description_getter=description_getter,
                                                 category_getter=lambda e: e.category,
                                                 callback=self.on_change_name,
                                                 editable=self.editable)
        self.name=self.selector.get_button()
        vbox.add(self.name)

        if self.model.registeredaction:
            # Action is derived from a RegisteredAction
            # we have information about its parameters.
            ra=self.model.registeredaction
            for name in self.sorted(ra.parameters):
                try:
                    v=self.model.parameters[name]
                except KeyError:
                    v=ra.default_value(name)
                p=self.build_parameter_widget(name=name,
                                              value=v,
                                              description=ra.describe_parameter(name))
                self.current_parameters[name]=v
                self.paramlist[name]=p
                vbox.add(p)
        else:
            # We display existing parameters
            for name in self.sorted(self.model.parameters):
                p=self.build_parameter_widget(name, self.model.parameters[name], "")
                self.paramlist[name]=p
                vbox.add(p)

        vbox.add(gtk.HSeparator())

        vbox.show_all()
        return vbox
Ejemplo n.º 10
0
class EditAction(EditGeneric):
    def __init__(self, action, catalog, editable=True, controller=None):
        self.model = action

        self.editable = editable
        self.current_name = action.name
        self.current_parameters = dict(action.parameters)
        # RegisteredAction matching the self.current_name
        self.registeredaction = catalog.get_action(self.current_name)

        self.controller = controller

        # Cache the parameters value. Indexed by action name.
        # Used when using the mousewheel on the action name list:
        # it should keep the parameters values
        self.cached_parameters = {}

        # Dict of parameter widgets (modified when the action name changes)
        # indexed by parameter name.
        self.paramlist = {}

        self.catalog = catalog
        self.widget = self.build_widget()

    def invalid_items(self):
        iv = [
            _("Parameter %s") % n for n in self.paramlist
            if not self.paramlist[n].entry.is_valid()
        ]
        return iv

    def update_value(self):
        if not self.editable:
            return False
        ra = self.catalog.get_action(self.current_name)
        self.model = Action(registeredaction=ra, catalog=self.catalog)
        regexp = re.compile('^(\(.+\)|)$')
        for n, v in self.current_parameters.items():
            # We ignore parameters fields that are empty or that match '^\(.+\)$'
            if not regexp.match(v):
                self.model.add_parameter(n, v)
        return True

    def sorted(self, l):
        """Return a sorted version of the list."""
        if isinstance(l, dict):
            res = list(l)
        else:
            res = l[:]
        res.sort()
        return res

    def on_change_name(self, element):
        if element.name == self.current_name:
            return True
        # Cache the old parameters values
        self.cached_parameters[
            self.current_name] = self.current_parameters.copy()

        self.current_name = element.name
        for w in self.paramlist.values():
            w.destroy()
        self.paramlist = {}

        ra = self.catalog.get_action(self.current_name)
        self.registeredaction = ra
        if self.current_name in self.cached_parameters:
            self.current_parameters = self.cached_parameters[self.current_name]
        else:
            self.current_parameters = {}.fromkeys(ra.parameters, "")

        for name in self.sorted(self.current_parameters):
            v = ra.default_value(name)
            p = self.build_parameter_widget(name, v,
                                            ra.describe_parameter(name))
            self.current_parameters[name] = v
            self.paramlist[name] = p
            p.show()
            self.widget.add(p)

        return True

    def on_change_parameter(self, entry, talesentry, name):
        value = talesentry.get_text()
        self.current_parameters[name] = value
        return True

    def build_parameter_widget(self, name, value, description):
        hbox = Gtk.HBox()
        label = Gtk.Label(label=name)
        hbox.pack_start(label, False, True, 0)

        ra = self.registeredaction
        if ra:
            # Get predefined values
            if callable(ra.predefined):
                predefined = ra.predefined(self.controller)[name]
            elif ra.predefined is not None:
                predefined = ra.predefined[name]
            else:
                predefined = None

        entry = TALESEntry(controller=self.controller, predefined=predefined)
        entry.set_text(value)
        entry.set_editable(self.editable)
        entry.entry.connect('changed', self.on_change_parameter, entry, name)

        entry.entry.set_tooltip_text(description)

        hbox.entry = entry

        hbox.pack_start(entry.widget, True, True, 0)
        hbox.show_all()
        return hbox

    def build_widget(self):
        vbox = Gtk.VBox()

        vbox.add(Gtk.HSeparator())

        def description_getter(element):
            if hasattr(element, 'description'):
                return element.description
            else:
                # it is a category
                return self.catalog.action_categories[element]

        c = self.catalog

        def expert_filter(l, attr=None):
            if config.data.preferences['expert-mode']:
                return l
            else:
                expert_categories = ('expert', 'gui', 'state')
                if attr is None:
                    # No attribute, directly test value
                    return [e for e in l if not e in expert_categories]
                else:
                    return [
                        e for e in l
                        if not getattr(e, attr) in expert_categories
                    ]

        self.selector = dialog.CategorizedSelector(
            title=_("Select an action"),
            elements=expert_filter(sorted(c.actions.values()), 'category'),
            categories=expert_filter(list(c.action_categories)),
            current=c.actions[self.current_name],
            description_getter=description_getter,
            category_getter=lambda e: e.category,
            callback=self.on_change_name,
            editable=self.editable)
        self.name = self.selector.get_button()
        vbox.add(self.name)

        if self.model.registeredaction:
            # Action is derived from a RegisteredAction
            # we have information about its parameters.
            ra = self.model.registeredaction
            for name in self.sorted(ra.parameters):
                try:
                    v = self.model.parameters[name]
                except KeyError:
                    v = ra.default_value(name)
                p = self.build_parameter_widget(
                    name=name,
                    value=v,
                    description=ra.describe_parameter(name))
                self.current_parameters[name] = v
                self.paramlist[name] = p
                vbox.add(p)
        else:
            # We display existing parameters
            for name in self.sorted(self.model.parameters):
                p = self.build_parameter_widget(name,
                                                self.model.parameters[name],
                                                "")
                self.paramlist[name] = p
                vbox.add(p)

        vbox.add(Gtk.HSeparator())

        vbox.show_all()
        return vbox
Ejemplo n.º 11
0
 def add_action(self, widget, actionsbox):
     """Callback for the Add action button."""
     ra = self.catalog.get_action("Message")
     action = Action(registeredaction=ra, catalog=self.catalog)
     self.add_action_widget(action, actionsbox)
Ejemplo n.º 12
0
    def do_create_element(self):
        """Create the element according to the widget data.

        @return: the created element, None if an error occurred
        """
        id_ = unicode(self.dialog.id_entry.get_text())
        title_ = unicode(self.dialog.title_entry.get_text())
        # Check validity of id.
        if not self.is_valid_id(id_):
            dialog.message_dialog(
                _("The identifier %s is not valid.\nIt must be composed of non-accentuated alphabetic characters\nUnderscore is allowed.") % id_)
            return None

        if self.controller.package._idgenerator.exists(id_):
            dialog.message_dialog(
                _("The identifier %s is already defined.") % id_)
            return None
        else:
            self.controller.package._idgenerator.add(id_)

        if self.dialog.type_combo:
            t = self.dialog.type_combo.get_current_element()

        if self.type_ == Annotation:
            if isinstance(self.parent, AnnotationType):
                parent=self.parent.rootPackage
            else:
                parent=self.parent
            el=parent.createAnnotation(
                ident=id_,
                type=t,
                author=config.data.userid,
                date=self.get_date(),
                fragment=MillisecondFragment(begin=0,
                                             duration=self.controller.player.stream_duration))
            if el.type._fieldnames:
                el.content.data="\n".join( sorted(el.type._fieldnames) )
            parent.annotations.append(el)
            self.controller.notify('AnnotationCreate', annotation=el)
        elif self.type_ == Relation:
            # Unused code: relations can not be created without annotations
            if isinstance(self.parent, RelationType):
                parent=self.parent.rootPackage
            else:
                parent=self.parent
            el=parent.createRelation(
                ident=id_,
                type=t,
                author=config.data.userid,
                date=self.get_date(),
                members=())
            parent.relations.append(el)
            self.controller.notify('RelationCreate', relation=el)
        elif self.type_ == Query:
            el=self.parent.createQuery(ident=id_)
            el.author=config.data.userid
            el.date=self.get_date()
            el.title=title_
            el.content.mimetype=t.id
            if t.id == 'application/x-advene-simplequery':
                # Create a basic query
                q=advene.rules.elements.SimpleQuery(sources=["here"])
                el.content.data=q.xml_repr()
                el.content.mimetype=t.id
            self.parent.queries.append(el)
            self.controller.notify('QueryCreate', query=el)
        elif self.type_ == View:
            el=self.parent.createView(
                ident=id_,
                author=config.data.userid,
                date=self.get_date(),
                clazz=self.parent.viewableClass,
                content_mimetype=t.id,
                )
            el.title=title_
            if t.id == 'application/x-advene-ruleset':
                # Create an empty ruleset to begin with
                r=RuleSet()

                # Create a new default Rule
                rule=SubviewList(name=_("Subviews"),
                                 elements=[])
                r.add_rule(rule)

                event=Event("AnnotationBegin")
                catalog=self.controller.event_handler.catalog
                ra=catalog.get_action("Message")
                action=Action(registeredaction=ra, catalog=catalog)
                for p in ra.parameters:
                    action.add_parameter(p, ra.defaults.get(p, ''))
                rule=Rule(name=_("Rule") + '1',
                          event=event,
                          action=action)
                r.add_rule(rule)

                el.content.data=r.xml_repr()

            self.parent.views.append(el)
            self.controller.notify('ViewCreate', view=el)
        elif self.type_ == Schema:
            el=self.parent.createSchema(
                ident=id_)
            el.author=config.data.userid
            el.date=self.get_date()
            el.title=title_
            self.parent.schemas.append(el)
            self.controller.notify('SchemaCreate', schema=el)
        elif self.type_ == AnnotationType:
            if not isinstance(self.parent, Schema):
                print "Error: bad invocation of CreateElementPopup"
                el=None
            else:
                el=self.parent.createAnnotationType(
                    ident=id_)
                el.author=config.data.userid
                el.date=self.get_date()
                el.title=title_
                el.mimetype=t.id
                el.setMetaData(config.data.namespace, 'color', self.parent.rootPackage._color_palette.next())
                el.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
            self.parent.annotationTypes.append(el)
            self.controller.notify('AnnotationTypeCreate', annotationtype=el)
        elif self.type_ == RelationType:
            if not isinstance(self.parent, Schema):
                print "Error: bad invocation of CreateElementPopup"
                el=None
            else:
                el=self.parent.createRelationType(
                    ident=id_)
                el.author=config.data.userid
                el.date=self.get_date()
                el.title=title_
                el.mimetype=t.id
                el.setMetaData(config.data.namespace, 'color', self.parent.rootPackage._color_palette.next())
                el.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                # Create a generic binary relationType
                el.hackedMemberTypes=(u'', u'')
            self.parent.relationTypes.append(el)
            self.controller.notify('RelationTypeCreate', relationtype=el)
        elif self.type_ == Resources:
            # Create a new dir.
            # Parent should be a Resources
            self.parent[id_]=Resources.DIRECTORY_TYPE
            el=self.parent[id_]
            self.controller.notify('ResourceCreate',
                                   resource=el)
        elif self.type_ == ResourceData:
            # Create a new resource file
            self.parent[id_]=_("New resource data")
            el=self.parent[id_]
            self.controller.notify('ResourceCreate',
                                   resource=el)

        else:
            el=None
            print "Not implemented yet."
        return el
Ejemplo n.º 13
0
    def do_create_element(self):
        """Create the element according to the widget data.

        @return: the created element, None if an error occurred
        """
        id_ = unicode(self.dialog.id_entry.get_text())
        title_ = unicode(self.dialog.title_entry.get_text())
        # Check validity of id.
        if not self.is_valid_id(id_):
            dialog.message_dialog(
                _("The identifier %s is not valid.\nIt must be composed of non-accentuated alphabetic characters\nUnderscore is allowed."
                  ) % id_)
            return None

        if self.controller.package._idgenerator.exists(id_):
            dialog.message_dialog(
                _("The identifier %s is already defined.") % id_)
            return None
        else:
            self.controller.package._idgenerator.add(id_)

        if self.dialog.type_combo:
            t = self.dialog.type_combo.get_current_element()

        if self.type_ == Annotation:
            if isinstance(self.parent, AnnotationType):
                parent = self.parent.rootPackage
            else:
                parent = self.parent
            el = parent.createAnnotation(
                ident=id_,
                type=t,
                author=config.data.userid,
                date=self.get_date(),
                fragment=MillisecondFragment(
                    begin=0, duration=self.controller.player.stream_duration))
            if el.type._fieldnames:
                el.content.data = "\n".join(sorted(el.type._fieldnames))
            parent.annotations.append(el)
            self.controller.notify('AnnotationCreate', annotation=el)
        elif self.type_ == Relation:
            # Unused code: relations can not be created without annotations
            if isinstance(self.parent, RelationType):
                parent = self.parent.rootPackage
            else:
                parent = self.parent
            el = parent.createRelation(ident=id_,
                                       type=t,
                                       author=config.data.userid,
                                       date=self.get_date(),
                                       members=())
            parent.relations.append(el)
            self.controller.notify('RelationCreate', relation=el)
        elif self.type_ == Query:
            el = self.parent.createQuery(ident=id_)
            el.author = config.data.userid
            el.date = self.get_date()
            el.title = title_
            el.content.mimetype = t.id
            if t.id == 'application/x-advene-simplequery':
                # Create a basic query
                q = advene.rules.elements.SimpleQuery(sources=["here"])
                el.content.data = q.xml_repr()
                el.content.mimetype = t.id
            self.parent.queries.append(el)
            self.controller.notify('QueryCreate', query=el)
        elif self.type_ == View:
            el = self.parent.createView(
                ident=id_,
                author=config.data.userid,
                date=self.get_date(),
                clazz=self.parent.viewableClass,
                content_mimetype=t.id,
            )
            el.title = title_
            if t.id == 'application/x-advene-ruleset':
                # Create an empty ruleset to begin with
                r = RuleSet()

                # Create a new default Rule
                rule = SubviewList(name=_("Subviews"), elements=[])
                r.add_rule(rule)

                event = Event("AnnotationBegin")
                catalog = self.controller.event_handler.catalog
                ra = catalog.get_action("Message")
                action = Action(registeredaction=ra, catalog=catalog)
                for p in ra.parameters:
                    action.add_parameter(p, ra.defaults.get(p, ''))
                rule = Rule(name=_("Rule") + '1', event=event, action=action)
                r.add_rule(rule)

                el.content.data = r.xml_repr()

            self.parent.views.append(el)
            self.controller.notify('ViewCreate', view=el)
        elif self.type_ == Schema:
            el = self.parent.createSchema(ident=id_)
            el.author = config.data.userid
            el.date = self.get_date()
            el.title = title_
            self.parent.schemas.append(el)
            self.controller.notify('SchemaCreate', schema=el)
        elif self.type_ == AnnotationType:
            if not isinstance(self.parent, Schema):
                print "Error: bad invocation of CreateElementPopup"
                el = None
            else:
                el = self.parent.createAnnotationType(ident=id_)
                el.author = config.data.userid
                el.date = self.get_date()
                el.title = title_
                el.mimetype = t.id
                el.setMetaData(config.data.namespace, 'color',
                               self.parent.rootPackage._color_palette.next())
                el.setMetaData(config.data.namespace, 'item_color',
                               'here/tag_color')
            self.parent.annotationTypes.append(el)
            self.controller.notify('AnnotationTypeCreate', annotationtype=el)
        elif self.type_ == RelationType:
            if not isinstance(self.parent, Schema):
                print "Error: bad invocation of CreateElementPopup"
                el = None
            else:
                el = self.parent.createRelationType(ident=id_)
                el.author = config.data.userid
                el.date = self.get_date()
                el.title = title_
                el.mimetype = t.id
                el.setMetaData(config.data.namespace, 'color',
                               self.parent.rootPackage._color_palette.next())
                el.setMetaData(config.data.namespace, 'item_color',
                               'here/tag_color')
                # Create a generic binary relationType
                el.hackedMemberTypes = (u'', u'')
            self.parent.relationTypes.append(el)
            self.controller.notify('RelationTypeCreate', relationtype=el)
        elif self.type_ == Resources:
            # Create a new dir.
            # Parent should be a Resources
            self.parent[id_] = Resources.DIRECTORY_TYPE
            el = self.parent[id_]
            self.controller.notify('ResourceCreate', resource=el)
        elif self.type_ == ResourceData:
            # Create a new resource file
            self.parent[id_] = _("New resource data")
            el = self.parent[id_]
            self.controller.notify('ResourceCreate', resource=el)

        else:
            el = None
            print "Not implemented yet."
        return el
Ejemplo n.º 14
0
    def do_create_element(self):
        """Create the element according to the widget data.

        @return: the created element, None if an error occurred
        """
        id_ = self.dialog.id_entry.get_text()
        title_ = self.dialog.title_entry.get_text()
        # Check validity of id.
        if not self.is_valid_id(id_):
            dialog.message_dialog(
                _("The identifier %s is not valid.\nIt must be composed of non-accentuated alphabetic characters\nUnderscore is allowed.") % id_)
            return None

        if self.controller.package._idgenerator.exists(id_):
            dialog.message_dialog(
                _("The identifier %s is already defined.") % id_)
            return None
        else:
            self.controller.package._idgenerator.add(id_)

        if self.dialog.type_combo:
            t = self.dialog.type_combo.get_current_element()

        if self.type_ == Annotation:
            if isinstance(self.parent, AnnotationType):
                parent=self.controller.package
            else:
                parent=self.parent
            el=parent.create_annotation(
                id=id_,
                type=t,
                media=self.controller.current_media,
                begin=0,
                end=self.controller.player.stream_duration)

            if el.type._fieldnames:
                el.content.data="\n".join( "%s=" % f for f in sorted(el.type._fieldnames) )
            self.controller.notify('AnnotationCreate', annotation=el)
        elif self.type_ == Query:
            el=self.parent.create_query(id=id_, mimetype=t.id)
            el.title=title_
            if t.id == 'application/x-advene-simplequery':
                # Create a basic query
                q=SimpleQuery(source="here")
                el.content.data=q.xml_repr()
            self.controller.notify('QueryCreate', query=el)
        elif self.type_ == View:
            el=self.parent.create_view(id=id_, mimetype=t.id)
            el.title=title_
            if t.id == 'application/x-advene-ruleset':
                # Create an empty ruleset to begin with
                r=RuleSet()

                # Create a new default Rule
                rule=SubviewList(name=_("Subviews"),
                                 elements=[])
                r.add_rule(rule)

                event=Event("AnnotationBegin")
                catalog=self.controller.event_handler.catalog
                ra=catalog.get_action("Message")
                action=Action(registeredaction=ra, catalog=catalog)
                for p in ra.parameters:
                    action.add_parameter(p, ra.defaults.get(p, ''))
                rule=Rule(name=_("Rule") + '1',
                          event=event,
                          action=action)
                r.add_rule(rule)

                el.content.data=r.xml_repr()
            self.controller.notify('ViewCreate', view=el)
        elif self.type_ == Schema:
            el=self.parent.create_schema(id=id_)
            el.title=title_
            self.controller.notify('SchemaCreate', schema=el)
        elif self.type_ == AnnotationType:
            if not isinstance(self.parent, Schema):
                print "Error: bad invocation of CreateElementPopup"
                el=None
            else:
                el=self.controller.package.create_annotation_type(id=id_)
                el.title=title_
                el.mimetype=t.id
                el.color=self.controller.package._color_palette.next()
                el.element_color='here/tag_color'
            self.controller.notify('AnnotationTypeCreate', annotationtype=el)
        elif self.type_ == RelationType:
            if not isinstance(self.parent, Schema):
                print "Error: bad invocation of CreateElementPopup"
                el=None
            else:
                el=self.controller.package.create_relation_type(id=id_)
                el.title=title_
                el.mimetype=t.id
                el.color=self.controller.package._color_palette.next()
                el.element_color='here/tag_color'
            self.controller.notify('RelationTypeCreate', relationtype=el)
        elif self.type_ == Resource:
            # Create a new resource file
            # FIXME: to implement
            self.parent[id_]=_("New resource data")
            el=self.parent[id_]
            self.controller.notify('ResourceCreate',
                                   resource=el)

        else:
            el=None
            print "Not implemented yet."
        return el