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