private static CategoryMembershipProperty Deserialize(XmlReader reader, IDictionary <Guid, Signal> signals, IDictionary <Guid, Bus> buses)
        {
            bool sticky = bool.Parse(reader.ReadElementString("Sticky"));
            CategoryMembershipLevel membership = (CategoryMembershipLevel)Enum.Parse(typeof(CategoryMembershipLevel), reader.ReadElementString("Membership"));
            ICategory category = Persistence.Serializer.Deserialize <ICategory>(reader, signals, buses);

            //Category.Deserialize(context, reader);
            return(new CategoryMembershipProperty(category, membership, sticky));
        }
        protected CategoryMembershipLevel EvaluateJointChildMembership(IList <Signal> signals)
        {
            if (signals.Count == 0)
            {
                return(CategoryMembershipLevel.Unknown);
            }
            CategoryMembershipLevel membership = CategoryMembershipLevel.Member;

            foreach (Signal s in signals)
            {
                CategoryMembershipLevel ret = IsMember(s, false);
                if (ret == CategoryMembershipLevel.NotMember)
                {
                    return(CategoryMembershipLevel.NotMember);
                }
                if (ret == CategoryMembershipLevel.Unknown)
                {
                    membership = CategoryMembershipLevel.Unknown;
                }
            }
            return(membership);
        }
        protected bool TryGetCachedMembership(Signal signal, out CategoryMembershipLevel membership)
        {
            if (signal == null)
            {
                throw new ArgumentNullException("signal");
            }

            // TODO: uncomment and fix

            //IProperty p;
            //if(((Signal)signal).Properties.TryLookupProperty(AssociatedPropertyId, out p))
            //{
            //    CategoryMembershipProperty property = p as CategoryMembershipProperty;
            //    if(property != null)
            //    {
            //        membership = property.CategoryMembership;
            //        return true;
            //    }
            //}
            membership = CategoryMembershipLevel.Unknown;
            return(false);
        }
        public override bool StillValidAfterDrive(Signal signal)
        {
            CategoryMembershipLevel newMembership = _category.IsMember(signal, true);

            if (newMembership == CategoryMembershipLevel.Unknown)
            {
                _categoryMembership = newMembership;
                return(false);
            }
            if (_categoryMembership != newMembership)
            {
                _categoryMembership = newMembership;
                if (_isSticky)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
 /// <param name="sticky">If true the property will stay attached (but updated) when the membership changes. If false the property will be removed. If the new state is unknown, the property is removed in both cases.</param>
 public CategoryMembershipProperty(ICategory category, CategoryMembershipLevel categoryMembership, bool sticky)
 {
     _category           = category;
     _categoryMembership = categoryMembership;
     _isSticky           = sticky;
 }
 /// <param name="sticky">If true the property will stay attached (but updated) when the membership changes. If false the property will be removed. If the new state is unknown, the property is removed in both cases.</param>
 public CategoryMembershipProperty(ICategory category, CategoryMembershipLevel categoryMembership, bool sticky)
 {
     _category = category;
     _categoryMembership = categoryMembership;
     _isSticky = sticky;
 }
 public override bool StillValidAfterEvent(Signal signal)
 {
     CategoryMembershipLevel newMembership = _category.IsMember(signal, true);
     if(newMembership == CategoryMembershipLevel.Unknown)
     {
         _categoryMembership = newMembership;
         return false;
     }
     if(_categoryMembership != newMembership)
     {
         _categoryMembership = newMembership;
         if(_isSticky)
             return true;
         else
             return false;
     }
     return true;
 }