00001
00012 #include "PickTable.h"
00013
00014 #include "controllers/DisplayController.h"
00015 #include "datareps/DataRep.h"
00016 #include "datasrcs/DataSourceController.h"
00017 #include "datasrcs/NTuple.h"
00018 #include "datasrcs/NTupleSorter.h"
00019 #include "graphics/Color.h"
00020 #include "graphics/SymbolType.h"
00021 #include "plotters/PlotterBase.h"
00022
00023 #if QT_VERSION < 0x040000
00024 #include <qheader.h>
00025 #include <qlistview.h>
00026 #else
00027 #include <q3header.h>
00028 #include <q3listview.h>
00029 #endif
00030
00031 #include <qpushbutton.h>
00032 #include <qlabel.h>
00033
00034 using namespace hippodraw;
00035
00036 using std::string;
00037 using std::vector;
00038
00039
00040 PickTable::
00041 PickTable ( PlotterBase * plotter )
00042 {
00043 m_target = plotter;
00044
00045 NTuple * ntuple = plotter -> createPickTuple ();
00046 m_sorter = new NTupleSorter ( ntuple );
00047
00048 const string & name = ntuple -> getName ();
00049 m_title->setText ( name.c_str() );
00050
00051 const DataRep * rep = plotter->getDataRep ( 0 );
00052 const string & type = rep -> name ();
00053
00054 string text = "Plot type : ";
00055 text += type.c_str();
00056 m_type->setText ( text.c_str() );
00057
00058
00059 #if QT_VERSION < 0x040000
00060 const vector < string > & labels = ntuple -> getLabels ();
00061 m_pick_table->setColumnText ( 1, labels[1].c_str() );
00062 m_pick_table->setColumnText ( 2, labels[2].c_str() );
00063 unsigned int size = ntuple -> columns ();
00064 if ( size == 3 ) {
00065 m_pick_table -> removeColumn ( 3 );
00066 }
00067 else {
00068 m_pick_table -> setColumnText ( 3, labels[3].c_str() );
00069 if ( size == 5 ) {
00070 const QString & str ( labels[4].c_str() );
00071 m_pick_table -> addColumn ( str );
00072 }
00073 }
00074
00075 #else
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #endif
00092 DataSourceController::instance()->registerNTuple ( ntuple );
00093
00094 #if QT_VERSION < 0x040000
00095 QHeader * header = m_pick_table->header();
00096 connect ( header, SIGNAL ( clicked (int) ),
00097 this, SLOT( listSorted ( int ) ) );
00098 m_pick_table->setSorting ( -1 );
00099 m_pick_table->setShowSortIndicator ( true );
00100 m_delete -> setEnabled ( false );
00101 #else
00102
00103
00104
00105
00106
00107
00108 #endif
00109
00110 }
00111
00112 void
00113 PickTable::
00114 listSorted ( int i )
00115 {
00116 m_sorter -> setSorting ( i );
00117 m_sorter -> sort ( );
00118
00119 #if QT_VERSION < 0x040000
00120 QListViewItem * item = m_pick_table ->selectedItem ();
00121 QString text = item -> text ( 0 );
00122 unsigned int selected = text.toUInt ();
00123 refreshItems ( selected );
00124 #else
00125
00126
00127
00128
00129 #endif
00130
00131 }
00132
00133 void PickTable::clear()
00134 {
00135 m_pick_table->clear();
00136 m_sorter->clear();
00137 }
00138
00139 void
00140 PickTable::
00141 addItem ( std::vector < double > & v )
00142 {
00143 unsigned int row = m_sorter -> rows ();
00144 v[0] = row;
00145 m_sorter -> addRow ( v );
00146
00147 refreshItems ( row );
00148 }
00149
00150 void
00151 PickTable::
00152 refreshItems ( unsigned int select )
00153 {
00154 m_pick_table -> clear();
00155
00156 unsigned int row = m_sorter->rows ();
00157 bool yes = row > 0;
00158 m_delete -> setEnabled ( yes );
00159
00160 #if QT_VERSION < 0x040000
00161 while ( row-- != 0 ) {
00162 const vector < double > & vec = m_sorter->getRow ( row );
00163 unsigned int current = static_cast < unsigned int > ( vec[0] );
00164 QListViewItem * item = new QListViewItem ( m_pick_table );
00165 unsigned int size = vec.size();
00166
00167 for ( unsigned int i = 0; i < size; i++ ) {
00168 item -> setText ( i, QString ( "%1" ).arg ( vec[i] ) );
00169 }
00170
00171 m_pick_table -> insertItem ( item );
00172
00173 if ( select == current ) {
00174 m_pick_table -> setSelected ( item, true );
00175 m_pick_table -> ensureItemVisible ( item );
00176 }
00177 }
00178 #else
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 #endif
00197 }
00198
00199 unsigned int
00200 PickTable::
00201 #if QT_VERSION < 0x040000
00202 indexOf ( QListViewItem * target )
00203 #else
00204 indexOf ( Q3ListViewItem * target )
00205 #endif
00206 {
00207 unsigned int index = 0;
00208 #if QT_VERSION < 0x040000
00209 QListViewItem * item = m_pick_table -> firstChild ();
00210 while ( item != target ) {
00211 index++;
00212 item = item->nextSibling();
00213 if ( item == 0 ) break;
00214 }
00215
00216 #else
00217
00218
00219
00220
00221
00222
00223
00224 #endif
00225
00226 return index;
00227 }
00228
00229 void PickTable::deleteSelectedItem ()
00230 {
00231 #if QT_VERSION < 0x040000
00232 QListViewItem * item = m_pick_table->selectedItem ();
00233 if ( item != 0 ) {
00234 unsigned int index = indexOf ( item );
00235
00236 m_sorter->eraseRow ( index );
00237
00238 unsigned int row = index == 0 ? 0 : index - 1;
00239 refreshItems ( row );
00240 }
00241 #else
00242
00243 #endif
00244 }
00245
00246 void
00247 PickTable::
00248 addDataRepButton ()
00249 {
00250 const string plotTypeStr ( "Scatter Plot" );
00251 NTuple * ntuple = m_sorter -> getNTuple ();
00252 const vector < string > & labels = ntuple -> getLabels ();
00253 vector < string > bindings;
00254 bindings.push_back ( labels[1] );
00255 bindings.push_back ( labels[2] );
00256 if ( labels.size() == 4 ) {
00257 if ( labels[3] == "Density" ) {
00258 bindings[1] = "Density";
00259 }
00260 }
00261
00262 DisplayController * controller = DisplayController::instance();
00263 DataRep * rep
00264 = controller -> addDataRep ( m_target, plotTypeStr,
00265 ntuple, bindings );
00266 rep -> setRepColor ( Color::red );
00267 rep -> setRepStyle ( Symbol::CIRCLE );
00268 rep -> setRepSize ( 6.0 );
00269 }
00270
00271 void
00272 PickTable::
00273 on_m_pick_table_selectionChanged ()
00274 {
00275 QListViewItem * item = m_pick_table -> selectedItem ();
00276 bool yes = item != 0;
00277
00278 m_delete -> setEnabled ( yes );
00279 }