Example #1
0
        /// <summary>
        /// 所有者である階層フィルターの兄弟フィルターのいずれにも適合しないか判断します。
        /// </summary>
        /// <param name="item">適合するか確認する対象</param>
        /// <param name="inquirySource">問い合わせ元</param>
        /// <returns>適合する場合 true、しない場合 false</returns>
        public override bool Match(T item, object inquirySource)
        {
            if (this._Owner == null)
            {
                throw new InvalidOperationException("所有者が設定されていません。");
            }

            IHierarchicalFilter <T> owner = (IHierarchicalFilter <T>) this._Owner;

            if (owner.Parent == null)
            {
                throw new InvalidOperationException("親のいない HierarchicalFilter に所有されています。");
            }

            // 親にマッチしなければ false
            if (!owner.Parent.Match(item, inquirySource))
            {
                return(false);
            }

            // 兄弟 (自分以外の親の子) にマッチすれば false
            foreach (IHierarchicalFilter <T> bros in owner.Parent.Children)
            {
                if (!(bros.Filter is ResudueFilter <T>) && bros.Filter.Match(item, inquirySource))
                {
                    return(false);
                }
            }

            // ここまでたどり着いたら ture
            return(true);
        }
Example #2
0
 /// <summary>
 /// ある階層フィルターが、この階層フィルターの祖先かどうかチェックします。
 /// </summary>
 /// <param name="item">祖先かどうかチェックする階層フィルター。</param>
 /// <returns>祖先の場合 true、祖先ではない場合 false。</returns>
 public bool IsSuperFilter(IHierarchicalFilter <T> item)
 {
     if (this.IsRoot)
     {
         return(false);
     }
     return(this.checkSuperFilter(item, this));
 }
        /// <summary>
        /// 2 つの IHierarchicalFilter&gt;TvProgram&lt; を比較して、一方が他方より小さいか、同じか、または大きいかを示す値を返します。
        /// x と y の大小が決められない場合は、= ではなく、x が大きいものとして扱われます。
        /// null &gt; 不明な階層フィルター &gt; 不明な TvProgram 特化型階層フィルター &gt; TvProgram 特化型階層フィルター フォルダー &gt; 「その他」でない既知の TvProgram 特化型階層フィルター &gt; 「その他」の既知の TvProgram 特化型階層フィルター。
        /// </summary>
        /// <remarks>
        /// <para>
        /// x が null の場合、y が何であれ x &gt; y (1) です。
        /// x が null でなく、y が null の場合 x &lt; y (-1) です。
        /// すなわち、null は常に大きいものとして扱われます。
        /// </para>
        /// <para>
        /// 上記を除き、x が ITvProgramHierarchicalFilter でない IHierarchicalFilter&gt;TvProgram&lt; である場合、y が何であれ x &gt; y (1) です。
        /// x が ITvProgramHierarchicalFilter であり、かつ、y が ITvProgramHierarchicalFilter でない IHierarchicalFilter&gt;TvProgram&lt; である場合、x &lt; y (-1) です。
        /// </para>
        /// <para>
        /// 上記を除き、x が TvProgramHierarchicalFilter でも、TvProgramHierarchicalFilterFolder でもない ITvProgramHierarchicalFilter である場合、y が何であれ x &gt; y (1) です。
        /// x が TvProgramHierarchicalFilter または TvProgramHierarchicalFilterFolder であり、かつ、y が TvProgramHierarchicalFilter でも TvProgramHierarchicalFilterFolder でもない ITvProgmraHierarchicalFilter である場合、x &lt; y (-1) です。
        /// </para>
        /// <para>
        /// 上記を除き、x が TvProgramHierarchicalFilterFolder であり、y が TvProgramHierarchicalFilterFolder でない場合、x &lt; y (-1) です。
        /// x が TvProgramHierarchicalFilterFolder であなく、y が TvProgramHierarchicalFilterFolder である場合、x &gt; y (1) です。
        /// </para>
        /// <para>
        /// 上記を除き、x の所有する IFilter&lt;TvProgram&gt; が TvProgramResudueFilter である場合、y なんであれ x &gt; y (1) です。
        /// x の所有する IFilter&lt;TvProgram&gt; が TvProgramResudueFilter でなく、かつ、y の所有する IFilter&lt;TvProgram&gt; が TvProgramResudueFilter である場合、x &gt; y (1) です。
        /// </para>
        /// <para>
        /// 上記を除くと、x および y は、両方とも TvProgramHierarchicalFilter であるか,、両方とも TvProgramHierarchicalFilterFolder であることになります。
        /// x および y が所有するフィルターは TvProgramResudueFilter ではありません。
        /// この時、x と y それぞれの Name プロパティを比較して、その結果を返します。等しいときは x が大きいとして扱われます。
        /// </para>
        /// </remarks>
        /// <param name="x">比較する最初のオブジェクト。</param>
        /// <param name="y">比較する 2 番目のオブジェクト。</param>
        /// <returns>x &lt; y のとき -1、x = y のとき 0、x &gt; y のとき 1。</returns>
        public int Compare(IHierarchicalFilter <TvProgram> x, IHierarchicalFilter <TvProgram> y)
        {
            if (x == null)
            {
                return(1);
            }
            if (y == null)
            {
                return(-1);
            }

            if (!(x is ITvProgramHierarchicalFilter))
            {
                return(1);
            }
            if (!(y is ITvProgramHierarchicalFilter))
            {
                return(-1);
            }

            if (!(x is TvProgramHierarchicalFilter))
            {
                return(1);
            }
            if (!(y is TvProgramHierarchicalFilter))
            {
                return(-1);
            }

            if (x.Filter is TvProgramFolderFilter && !(y.Filter is TvProgramFolderFilter))
            {
                return(-1);
            }
            if (!(x.Filter is TvProgramFolderFilter) && y.Filter is TvProgramFolderFilter)
            {
                return(1);
            }

            if (x.Filter is TvProgramResudueFilter)
            {
                return(1);
            }
            if (y.Filter is TvProgramResudueFilter)
            {
                return(-1);
            }

            if (((TvProgramHierarchicalFilter)x).Name.CompareTo(((TvProgramHierarchicalFilter)y).Name) < 0)
            {
                return(-1);
            }
            else
            {
                return(1);
            }
        }
Example #4
0
 private bool checkSuperFilter(IHierarchicalFilter <T> item, IHierarchicalFilter <T> checkAt)
 {
     if (checkAt.Parent == item)
     {
         return(true);
     }
     if (checkAt.Parent.IsRoot)
     {
         return(false);
     }
     return(this.checkSuperFilter(item, checkAt.Parent));
 }
Example #5
0
 private bool checkSubFilter(IHierarchicalFilter <T> item, IHierarchicalFilter <T> checkAt)
 {
     foreach (IHierarchicalFilter <T> child in checkAt.Children)
     {
         if (child == item)
         {
             return(true);
         }
     }
     foreach (IHierarchicalFilter <T> child in checkAt.Children)
     {
         return(this.checkSubFilter(item, child));
     }
     return(false);
 }
Example #6
0
        /// <summary>
        /// 問い合わせ元が所有者の子なら親の回答を、それ以外なら子の回答の OR を返します。
        /// </summary>
        /// <param name="item">適合するか確認する対象</param>
        /// <param name="inquirySource">問い合わせ元</param>
        /// <returns>適合する場合 true、しない場合 false</returns>
        public override bool Match(T item, object inquirySource)
        {
            if (this._Owner == null)
            {
                throw new InvalidOperationException("所有者が設定されていません。");
            }

            IHierarchicalFilter <T> owner = (IHierarchicalFilter <T>) this._Owner;

            if (inquirySource != null &&
                inquirySource is IHierarchicalFilter <T> &&
                owner.IsSubFilter((IHierarchicalFilter <T>)inquirySource)
                )
            {
                if (owner.IsRoot)
                {
                    return(true);
                }
                else
                {
                    return(owner.Parent.Match(item, inquirySource));
                }
            }

            if (!owner.IsRoot && !owner.Parent.Match(item, inquirySource))
            {
                return(false);
            }

            // 既定の戻り値。
            bool result = false;

            foreach (IHierarchicalFilter <T> child in owner.Children)
            {
                if (!(child.Filter is ResudueFilter <T>) && child.Filter.Match(item, inquirySource))
                {
                    result = true;
                    break;
                }
            }
            return(result);
        }
Example #7
0
        /// <summary>
        /// 階層フィルターの SubFilterPropertyChanged イベント用ハンドラー。
        /// collectionChangeEventHandler メソッドにより、階層フィルターに設定されます。
        /// IsSelected プロパティが変更された場合、SelectedItem を更新します。
        /// このハンドラー内部で、SubFilterPropertyChanged イベントを発生します。
        /// </summary>
        /// <param name="sender">イベントの発生元</param>
        /// <param name="e">イベントの引数</param>
        private void subFilterPropertyChangedEventHandler(object sender, PropertyChangedEventArgs e)
        {
            if (sender is IHierarchicalFilter <T> )
            {
                IHierarchicalFilter <T> item = (IHierarchicalFilter <T>)sender;
                switch (e.PropertyName)
                {
                case "IsSelected":
                    if (item.IsSelected)
                    {
                        this.SelectedItem = item;
                    }
                    break;
                }

                if (this.SubFilterPropertyChanged != null)
                {
                    this.SubFilterPropertyChanged(sender, e);
                }
            }
        }
Example #8
0
 /// <summary>
 /// ある階層フィルターが、この階層フィルターの子孫かどうかチェックします。
 /// </summary>
 /// <param name="item">子孫かどうかチェックする階層フィルター。</param>
 /// <returns>子孫の場合 true、子孫ではない場合 false。</returns>
 public bool IsSubFilter(IHierarchicalFilter <T> item)
 {
     return(this.checkSubFilter(item, this));
 }