llviewquery.cpp

Go to the documentation of this file.
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 // LLViewQuery
00071 //
00072 
00073 viewList_t LLViewQuery::run(LLView* view) const
00074 {
00075         viewList_t result;
00076 
00077         // prefilter gets immediate children of view
00078         filterResult_t pre = runFilters(view, *view->getChildList(), mPreFilters);
00079         if(!pre.first && !pre.second)
00080         {
00081                 // not including ourselves or the children
00082                 // nothing more to do
00083                 return result;
00084         }
00085 
00086         viewList_t filtered_children;
00087         filterResult_t post(TRUE, TRUE);
00088         if(pre.second)
00089         {
00090                 // run filters on children
00091                 filterChildren(view, filtered_children);
00092                 // only run post filters if this element passed pre filters
00093                 // so if you failed to pass the pre filter, you can't filter out children in post
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); // sort the children per the sorter
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         /*virtual*/ 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 

Generated on Fri May 16 08:33:01 2008 for SecondLife by  doxygen 1.5.5