00001
00032 #ifndef LL_LLVIEWQUERY_H
00033 #define LL_LLVIEWQUERY_H
00034
00035 #include <list>
00036
00037 #include "llmemory.h"
00038 #include "llui.h"
00039
00040 class LLView;
00041
00042 typedef std::list<LLView *> viewList_t;
00043 typedef std::pair<BOOL, BOOL> filterResult_t;
00044
00045
00046 class LLQueryFilter
00047 {
00048 public:
00049 virtual ~LLQueryFilter() {};
00050 virtual filterResult_t operator() (const LLView* const view, const viewList_t & children) const = 0;
00051 };
00052
00053 class LLQuerySorter
00054 {
00055 public:
00056 virtual ~LLQuerySorter() {};
00057 virtual void operator() (LLView * parent, viewList_t &children) const;
00058 };
00059
00060 class LLLeavesFilter : public LLQueryFilter, public LLSingleton<LLLeavesFilter>
00061 {
00062 filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
00063 };
00064
00065 class LLRootsFilter : public LLQueryFilter, public LLSingleton<LLRootsFilter>
00066 {
00067 filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
00068 };
00069
00070 class LLVisibleFilter : public LLQueryFilter, public LLSingleton<LLVisibleFilter>
00071 {
00072 filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
00073 };
00074
00075 class LLEnabledFilter : public LLQueryFilter, public LLSingleton<LLEnabledFilter>
00076 {
00077 filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
00078 };
00079
00080 class LLTabStopFilter : public LLQueryFilter, public LLSingleton<LLTabStopFilter>
00081 {
00082 filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
00083 };
00084
00085 class LLCtrlFilter : public LLQueryFilter, public LLSingleton<LLCtrlFilter>
00086 {
00087 filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
00088 };
00089
00090 template <class T>
00091 class LLWidgetTypeFilter : public LLQueryFilter
00092 {
00093 filterResult_t operator() (const LLView* const view, const viewList_t & children) const
00094 {
00095 return filterResult_t(dynamic_cast<const T*>(view) != NULL, TRUE);
00096 }
00097
00098 };
00099
00100
00101 class LLViewQuery
00102 {
00103 public:
00104 typedef std::list<const LLQueryFilter*> filterList_t;
00105 typedef filterList_t::iterator filterList_iter_t;
00106 typedef filterList_t::const_iterator filterList_const_iter_t;
00107
00108 LLViewQuery() : mPreFilters(), mPostFilters(), mSorterp() {}
00109 virtual ~LLViewQuery() {}
00110
00111 void addPreFilter(const LLQueryFilter* prefilter) { mPreFilters.push_back(prefilter); }
00112 void addPostFilter(const LLQueryFilter* postfilter) { mPostFilters.push_back(postfilter); }
00113 const filterList_t & getPreFilters() const { return mPreFilters; }
00114 const filterList_t & getPostFilters() const { return mPostFilters; }
00115
00116 void setSorter(const LLQuerySorter* sorter) { mSorterp = sorter; }
00117 const LLQuerySorter* getSorter() const { return mSorterp; }
00118
00119 viewList_t run(LLView * view) const;
00120
00121 viewList_t operator () (LLView * view) const { return run(view); }
00122
00123
00124 virtual void filterChildren(LLView * view, viewList_t & filtered_children) const;
00125
00126 private:
00127
00128 filterResult_t runFilters(LLView * view, const viewList_t children, const filterList_t filters) const;
00129
00130 filterList_t mPreFilters;
00131 filterList_t mPostFilters;
00132 const LLQuerySorter* mSorterp;
00133 };
00134
00135 class LLCtrlQuery : public LLViewQuery
00136 {
00137 public:
00138 LLCtrlQuery();
00139 };
00140
00141 #endif // LL_LLVIEWQUERY_H