/// <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); }
/// <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>TvProgram< を比較して、一方が他方より小さいか、同じか、または大きいかを示す値を返します。 /// x と y の大小が決められない場合は、= ではなく、x が大きいものとして扱われます。 /// null > 不明な階層フィルター > 不明な TvProgram 特化型階層フィルター > TvProgram 特化型階層フィルター フォルダー > 「その他」でない既知の TvProgram 特化型階層フィルター > 「その他」の既知の TvProgram 特化型階層フィルター。 /// </summary> /// <remarks> /// <para> /// x が null の場合、y が何であれ x > y (1) です。 /// x が null でなく、y が null の場合 x < y (-1) です。 /// すなわち、null は常に大きいものとして扱われます。 /// </para> /// <para> /// 上記を除き、x が ITvProgramHierarchicalFilter でない IHierarchicalFilter>TvProgram< である場合、y が何であれ x > y (1) です。 /// x が ITvProgramHierarchicalFilter であり、かつ、y が ITvProgramHierarchicalFilter でない IHierarchicalFilter>TvProgram< である場合、x < y (-1) です。 /// </para> /// <para> /// 上記を除き、x が TvProgramHierarchicalFilter でも、TvProgramHierarchicalFilterFolder でもない ITvProgramHierarchicalFilter である場合、y が何であれ x > y (1) です。 /// x が TvProgramHierarchicalFilter または TvProgramHierarchicalFilterFolder であり、かつ、y が TvProgramHierarchicalFilter でも TvProgramHierarchicalFilterFolder でもない ITvProgmraHierarchicalFilter である場合、x < y (-1) です。 /// </para> /// <para> /// 上記を除き、x が TvProgramHierarchicalFilterFolder であり、y が TvProgramHierarchicalFilterFolder でない場合、x < y (-1) です。 /// x が TvProgramHierarchicalFilterFolder であなく、y が TvProgramHierarchicalFilterFolder である場合、x > y (1) です。 /// </para> /// <para> /// 上記を除き、x の所有する IFilter<TvProgram> が TvProgramResudueFilter である場合、y なんであれ x > y (1) です。 /// x の所有する IFilter<TvProgram> が TvProgramResudueFilter でなく、かつ、y の所有する IFilter<TvProgram> が TvProgramResudueFilter である場合、x > 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 < y のとき -1、x = y のとき 0、x > 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); } }
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)); }
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); }
/// <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); }
/// <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); } } }
/// <summary> /// ある階層フィルターが、この階層フィルターの子孫かどうかチェックします。 /// </summary> /// <param name="item">子孫かどうかチェックする階層フィルター。</param> /// <returns>子孫の場合 true、子孫ではない場合 false。</returns> public bool IsSubFilter(IHierarchicalFilter <T> item) { return(this.checkSubFilter(item, this)); }