00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <string>
00026 #include <vector>
00027
00028 #include <boost/lexical_cast.hpp>
00029
00030 #include "WStringUtils.h"
00031 #include "WItemSelection.h"
00032
00033 #include "WItemSelector.h"
00034
00035 WItemSelector::WItemSelector( boost::shared_ptr< WItemSelection > selection, IndexList selected ):
00036 m_selection( selection ),
00037 m_selected( selected ),
00038 m_invalidateSignalConnection(),
00039 m_valid( true )
00040 {
00041
00042 m_invalidateSignalConnection = m_selection->getChangeCondition()->subscribeSignal( boost::bind( &WItemSelector::invalidate, this ) );
00043 }
00044
00045 WItemSelector::WItemSelector( const WItemSelector& other ):
00046 m_selection( other.m_selection ),
00047 m_selected( other.m_selected ),
00048 m_valid( other.m_valid )
00049 {
00050 m_invalidateSignalConnection = m_selection->getChangeCondition()->subscribeSignal( boost::bind( &WItemSelector::invalidate, this ) );
00051 }
00052
00053 WItemSelector& WItemSelector::operator=( const WItemSelector & other )
00054 {
00055 if( this != &other )
00056 {
00057 m_selection = other.m_selection;
00058 m_selected = other.m_selected;
00059 m_valid = other.m_valid;
00060
00061 m_invalidateSignalConnection = m_selection->getChangeCondition()->subscribeSignal( boost::bind( &WItemSelector::invalidate, this ) );
00062 }
00063
00064
00065 return *this;
00066 }
00067
00068 WItemSelector::~WItemSelector()
00069 {
00070
00071 m_invalidateSignalConnection.disconnect();
00072 }
00073
00074 WItemSelector WItemSelector::newSelector( IndexList selected ) const
00075 {
00076 return createSelector( selected );
00077 }
00078
00079 WItemSelector WItemSelector::newSelector( size_t selected ) const
00080 {
00081 IndexList n = m_selected;
00082 n.push_back( selected );
00083 return createSelector( n );
00084 }
00085
00086 WItemSelector WItemSelector::newSelector( const std::string asString ) const
00087 {
00088 std::vector<std::string> tokens;
00089 tokens = string_utils::tokenize( asString, ";" );
00090
00091 IndexList l;
00092 for( size_t i = 0; i < tokens.size(); ++i )
00093 {
00094 l.push_back( boost::lexical_cast< size_t >( tokens[i] ) );
00095 }
00096
00097 return createSelector( l );
00098 }
00099
00100 WItemSelector WItemSelector::newSelector() const
00101 {
00102 WItemSelector s( *this );
00103 s.m_valid = true;
00104
00105 for( IndexList::iterator i = s.m_selected.begin(); i != s.m_selected.end(); ++i )
00106 {
00107 if( ( *i ) >= m_selection->size() )
00108 {
00109 s.m_selected.erase( i );
00110 }
00111 }
00112 return s;
00113 }
00114
00115 std::ostream& WItemSelector::operator<<( std::ostream& out ) const
00116 {
00117 for( WItemSelector::IndexList::const_iterator iter = m_selected.begin(); iter != m_selected.end(); ++iter )
00118 {
00119 out << ( *iter );
00120 if( ( iter + 1 ) != m_selected.end() )
00121 {
00122 out << ";";
00123 }
00124 }
00125 return out;
00126 }
00127
00128 std::ostream& operator<<( std::ostream& out, const WItemSelector& other )
00129 {
00130 return other.operator<<( out );
00131 }
00132
00133 bool WItemSelector::operator==( const WItemSelector& other ) const
00134 {
00135 return ( ( m_selection == other.m_selection ) && ( m_selected == other.m_selected ) && ( m_valid == other.m_valid ) );
00136 }
00137
00138 size_t WItemSelector::sizeAll() const
00139 {
00140 return m_selection->size();
00141 }
00142
00143 size_t WItemSelector::size() const
00144 {
00145 return m_selected.size();
00146 }
00147
00148 const boost::shared_ptr< WItemSelectionItem > WItemSelector::atAll( size_t index ) const
00149 {
00150 return m_selection->at( index );
00151 }
00152
00153 const boost::shared_ptr< WItemSelectionItem > WItemSelector::at( size_t index ) const
00154 {
00155 return m_selection->at( getItemIndexOfSelected( index ) );
00156 }
00157
00158 size_t WItemSelector::getItemIndexOfSelected( size_t index ) const
00159 {
00160 return m_selected.at( index );
00161 }
00162
00163 bool WItemSelector::empty() const
00164 {
00165 return ( size() == 0 );
00166 }
00167
00168 void WItemSelector::invalidate()
00169 {
00170 m_valid = false;
00171 }
00172
00173 bool WItemSelector::isValid() const
00174 {
00175 return m_valid;
00176 }
00177
00178 WItemSelector WItemSelector::createSelector( const IndexList& selected ) const
00179 {
00180 WItemSelector s = WItemSelector( m_selection, selected );
00181 return s;
00182 }
00183
00184 void WItemSelector::lock()
00185 {
00186
00187
00188 m_lock = m_selection->getReadTicket();
00189 }
00190
00191 void WItemSelector::unlock()
00192 {
00193 m_lock.reset();
00194 }
00195
00196 WItemSelector::operator unsigned int() const
00197 {
00198 return getItemIndexOfSelected( 0 );
00199 }
00200
00201 WItemSelector::IndexList WItemSelector::getIndexList() const
00202 {
00203 return m_selected;
00204 }
00205