00001
00032 #include "linden_common.h"
00033
00034 #include "llview.h"
00035 #include "lluictrl.h"
00036 #include "llviewquery.h"
00037
00038 void LLQuerySorter::operator() (LLView * parent, viewList_t &children) const {}
00039
00040 filterResult_t LLLeavesFilter::operator() (const LLView* const view, const viewList_t & children) const
00041 {
00042 return filterResult_t(children.empty(), TRUE);
00043 }
00044
00045 filterResult_t LLRootsFilter::operator() (const LLView* const view, const viewList_t & children) const
00046 {
00047 return filterResult_t(TRUE, FALSE);
00048 }
00049
00050 filterResult_t LLVisibleFilter::operator() (const LLView* const view, const viewList_t & children) const
00051 {
00052 return filterResult_t(view->getVisible(), view->getVisible());
00053 }
00054 filterResult_t LLEnabledFilter::operator() (const LLView* const view, const viewList_t & children) const
00055 {
00056 return filterResult_t(view->getEnabled(), view->getEnabled());
00057 }
00058 filterResult_t LLTabStopFilter::operator() (const LLView* const view, const viewList_t & children) const
00059 {
00060 return filterResult_t(view->isCtrl() && static_cast<const LLUICtrl*>(view)->hasTabStop(),
00061 view->canFocusChildren());
00062 }
00063
00064 filterResult_t LLCtrlFilter::operator() (const LLView* const view, const viewList_t & children) const
00065 {
00066 return filterResult_t(view->isCtrl(),TRUE);
00067 }
00068
00069
00070
00071
00072
00073 viewList_t LLViewQuery::run(LLView* view) const
00074 {
00075 viewList_t result;
00076
00077
00078 filterResult_t pre = runFilters(view, *view->getChildList(), mPreFilters);
00079 if(!pre.first && !pre.second)
00080 {
00081
00082
00083 return result;
00084 }
00085
00086 viewList_t filtered_children;
00087 filterResult_t post(TRUE, TRUE);
00088 if(pre.second)
00089 {
00090
00091 filterChildren(view, filtered_children);
00092
00093
00094 if (pre.first)
00095 {
00096 post = runFilters(view, filtered_children, mPostFilters);
00097 }
00098 }
00099
00100 if(pre.first && post.first)
00101 {
00102 result.push_back(view);
00103 }
00104
00105 if(pre.second && post.second)
00106 {
00107 result.insert(result.end(), filtered_children.begin(), filtered_children.end());
00108 }
00109
00110 return result;
00111 }
00112
00113 void LLViewQuery::filterChildren(LLView * view, viewList_t & filtered_children) const
00114 {
00115 LLView::child_list_t views(*(view->getChildList()));
00116 if (mSorterp)
00117 {
00118 (*mSorterp)(view, views);
00119 }
00120 for(LLView::child_list_iter_t iter = views.begin();
00121 iter != views.end();
00122 iter++)
00123 {
00124 viewList_t indiv_children = this->run(*iter);
00125 filtered_children.insert(filtered_children.end(), indiv_children.begin(), indiv_children.end());
00126 }
00127 }
00128
00129 filterResult_t LLViewQuery::runFilters(LLView * view, const viewList_t children, const filterList_t filters) const
00130 {
00131 filterResult_t result = filterResult_t(TRUE, TRUE);
00132 for(filterList_const_iter_t iter = filters.begin();
00133 iter != filters.end();
00134 iter++)
00135 {
00136 filterResult_t filtered = (**iter)(view, children);
00137 result.first = result.first && filtered.first;
00138 result.second = result.second && filtered.second;
00139 }
00140 return result;
00141 }
00142
00143 class SortByTabOrder : public LLQuerySorter, public LLSingleton<SortByTabOrder>
00144 {
00145 void operator() (LLView * parent, LLView::child_list_t &children) const
00146 {
00147 children.sort(LLCompareByTabOrder(parent->getCtrlOrder()));
00148 }
00149 };
00150
00151 LLCtrlQuery::LLCtrlQuery() :
00152 LLViewQuery()
00153 {
00154 setSorter(SortByTabOrder::getInstance());
00155 }
00156