00001
00022 #include "DGVTable.h"
00023
00024 #include <fstream>
00025
00026
00027 DGVTable::DGVTable(QWidget *parent) : QTableWidget(parent)
00028 {
00029 createConnections();
00030 }
00031
00032 DGVTable::~DGVTable()
00033 {
00034
00035 }
00036
00037 void DGVTable::setName(QString filename)
00038 {
00039 name = filename;
00040 setWindowTitle(strippedNamePrefix());
00041 }
00042
00043 void DGVTable::setItem(int row, int column, tableType value)
00044 {
00045 QTableWidgetItem *item = NULL;
00046 QString tmp;
00047
00048 tmp = tmp.setNum(value);
00049 item = new QTableWidgetItem();
00050 item->setText(tmp);
00051 QTableWidget::setItem(row,column,item);
00052
00053 }
00054
00055 void DGVTable::setItem(int row, int column, QString value)
00056 {
00057 QTableWidgetItem *item = NULL;
00058
00059 item = new QTableWidgetItem();
00060 item->setText(value);
00061 QTableWidget::setItem(row,column,item);
00062
00063 }
00064
00065 tableType DGVTable::getItem(int x, int y)
00066 {
00067 QString tmp;
00068
00069 tmp = QTableWidget::item(x,y)->text();
00070
00071 return tmp.toDouble();
00072 }
00073
00074 void DGVTable::zapSelection()
00075 {
00076 QList<QTableWidgetItem*> selection;
00077
00078 selection = QTableWidget::selectedItems();
00079 for(int j = 0; j < selection.size(); j ++)
00080 selection[j]->setText("0");
00081 }
00082
00083 void DGVTable::delSelection()
00084 {
00085 QList<QTableWidgetSelectionRange> selectedRange;
00086 int size = 0, start = 0;
00087
00088 selectedRange = QTableWidget::selectedRanges();
00089
00090 for(int j = 0; j < selectedRange.size(); j ++)
00091 {
00092 if(selectedRange[j].columnCount() < selectedRange[j].rowCount())
00093 {
00095 size = selectedRange[j].columnCount();
00096 start = selectedRange[j].leftColumn();
00097
00098
00099
00100 for(int j = start; j < size+start; j ++)
00101 QTableWidget::removeColumn(j);
00102 }
00103 else
00104 {
00105 size = selectedRange[j].rowCount();
00106 start = selectedRange[j].topRow();
00107
00108 for(int j = start; j < size+start; j ++)
00109 QTableWidget::removeRow(j);
00110 }
00111 }
00112 }
00113
00114 void DGVTable::plotSelection()
00115 {
00116 Array<Array<double,1>,1> selectedData;
00117 Array<Array<double,1>,1> selectedDataX;
00118 QList<QTableWidgetItem*> selection;
00119 QList<QTableWidgetSelectionRange> selectedRange;
00120 DGVPlot *tmpPlot = NULL;
00121 int size = 0, start = 0, count = 0;
00122
00124 selection = QTableWidget::selectedItems();
00126 selectedRange = QTableWidget::selectedRanges();
00128 selectedData.resizeAndPreserve(selectedRange.size());
00129 selectedDataX.resizeAndPreserve(selectedRange.size());
00132
00133 cerr << "Bug Warning: If selections not appearing in plot, use Crtl key instead of Shift key.\n";
00135 for(int j = 0; j < selectedRange.size(); j ++)
00136 {
00138 if(selectedRange[j].columnCount() < selectedRange[j].rowCount())
00139 {
00140 size = selectedRange[j].rowCount();
00141 start = selectedRange[j].topRow();
00142 }
00143 else
00144 {
00145 size = selectedRange[j].columnCount();
00146 start = selectedRange[j].leftColumn();
00147 }
00148
00149 selectedData(j).resizeAndPreserve(size);
00150 selectedDataX(j).resizeAndPreserve(size);
00151 for(int k = count; k < count+size; k ++)
00152 {
00153 selectedData(j)(k-count) = selection[k]->text().toDouble();
00154 selectedDataX(j)(k-count) = start+(k-count);
00155 }
00156 count += size;
00157 }
00158
00159 tmpPlot = new DGVPlot(this);
00160 tmpPlot->createCurvePlots(selectedDataX,selectedData,"Selection Plot");
00161
00162 emit plotAvailable(tmpPlot);
00163 }
00164
00165 void DGVTable::scanSelection()
00166 {
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 }
00192
00193 void DGVTable::saveSelection()
00194 {
00195 QFileDialog *fileSaver = new QFileDialog(this);
00196 QList<QTableWidgetItem*> selection;
00197 QList<QTableWidgetSelectionRange> selectedRange;
00198 int size = 0, start = 0, count = 0;
00199
00200 QString filename = fileSaver->getSaveFileName(this,
00201 tr("Select File Name to Save"),
00202 ".",
00203 tr("Data Files (*.csv)"));
00204
00205 if (!filename.isEmpty())
00206 {
00208 selection = QTableWidget::selectedItems();
00210 selectedRange = QTableWidget::selectedRanges();
00211
00214
00215 cerr << "Bug Warning: If selections not appearing in plot, use Crtl key instead of Shift key.\n";
00216
00217 QFile file("test.csv");
00218 if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
00219 return;
00220 QTextStream *out = new QTextStream(&file);
00221
00222 for(int j = 0; j < selectedRange.size(); j ++)
00223 {
00225 if(selectedRange[j].columnCount() < selectedRange[j].rowCount())
00226 {
00227 size = selectedRange[j].rowCount();
00228 start = selectedRange[j].topRow();
00229 }
00230 else
00231 {
00232 size = selectedRange[j].columnCount();
00233 start = selectedRange[j].leftColumn();
00234 }
00235
00236 for(int k = count; k < count+size; k ++)
00237 (*out) << selection[k]->text().toDouble() << ", ";
00238 (*out) << endl;
00239
00240 count += size;
00241 }
00242
00243 delete out;
00244 file.close();
00245 }
00246 }
00247
00248 void DGVTable::saveAll()
00249 {
00250 QFileDialog *fileSaver = new QFileDialog(this);
00251 QString filename = fileSaver->getSaveFileName(this,
00252 tr("Select File Name to Save"),
00253 ".",
00254 tr("Data Files (*.csv)"));
00255
00256 if (!filename.isEmpty())
00257 {
00258 QFile file(filename);
00259
00260 if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
00261 return;
00262
00263 QTextStream *out = new QTextStream(&file);
00264
00265 for(int j = 0; j < QTableWidget::rowCount(); j ++)
00266 {
00267 for(int k = 0; k < QTableWidget::columnCount(); k ++)
00268 (*out) << item(j,k)->text().toDouble() << ", ";
00269 (*out) << endl;
00270 }
00271
00272 delete out;
00273 file.close();
00274 }
00275 }
00276
00277 bool DGVTable::loadCSV(const QString filename)
00278 {
00279 int cols = 0;
00280 QFile file(filename);
00281 QString line;
00282 tableType tmp = 0;
00283 char comma;
00284
00285 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
00286 return false;
00287
00290 QTextStream *in = new QTextStream(&file);
00291 line = in->readLine();
00292 line.simplified();
00293
00294 if(line.contains(","))
00295 cols = line.count(",");
00296 else if(line.contains(" "))
00297 cols = line.count(" ") + 1;
00298 else
00299 return false;
00300
00301 delete in;
00302 file.reset();
00303 in = new QTextStream(&file);
00304
00305
00306 if(cols > 0)
00307 {
00308 setColumnCount(cols);
00309 while(!in->atEnd())
00310 {
00311 insertRow(QTableWidget::rowCount());
00312 for(int k = 0; k < cols; k ++)
00313 {
00314 (*in) >> tmp;
00315 (*in) >> comma;
00316
00317 setItem(QTableWidget::rowCount()-1,k,tmp);
00318 }
00319 }
00320 }
00321
00322 delete in;
00323 return true;
00324 }
00325
00326 void DGVTable::setData(Array<tableType,2> &values)
00327 {
00328 setRowCount(values.rows());
00329 setColumnCount(values.cols());
00330 for(int j = 0; j < values.rows(); j ++)
00331 for(int k = 0; k < values.cols(); k ++)
00332 setItem(j,k,values(j,k));
00333 }
00334
00335 Array<tableType,2>& DGVTable::data()
00336 {
00337 tableData.resize(QTableWidget::rowCount(),QTableWidget::columnCount());
00338
00339 for(int j = 0; j < QTableWidget::rowCount(); j ++)
00340 for(int k = 0; k < QTableWidget::columnCount(); k ++)
00341 tableData(j,k) = getItem(j,k);
00342
00343 return tableData;
00344 }
00345
00346 QString DGVTable::strippedName()
00347 {
00348 return QFileInfo(name).fileName();
00349 }
00350
00351 QString DGVTable::strippedNamePrefix()
00352 {
00353 return "Table: " + QFileInfo(name).fileName();
00354 }
00355
00356 void DGVTable::contextMenuEvent(QContextMenuEvent *event)
00357 {
00358 QMenu menu(this);
00359
00360 zapAct = menu.addAction(tr("&Zap"));
00361 zapAct->setShortcut(tr("Ctrl+Shift+z"));
00362
00363 delAct = menu.addAction(tr("&Delete"));
00364 delAct->setShortcut(tr("Ctrl+Shift+d"));
00365
00366 menu.addSeparator();
00367 plotAct = menu.addAction(tr("&Plot"));
00368 plotAct->setShortcut(tr("Ctrl+Shift+p"));
00369
00370 scanAct = menu.addAction(tr("&Scan"));
00371 scanAct->setShortcut(tr("Ctrl+Shift+a"));
00372
00373 menu.addSeparator();
00374 saveAct = menu.addAction(tr("&Save Selection"));
00375 saveAct->setShortcut(tr("Ctrl+Shift+s"));
00376 saveAllAct = menu.addAction(tr("Save &Entire Table"));
00377 saveAllAct->setShortcut(tr("Ctrl+Shift+e"));
00378 closeAct = menu.addAction(tr("&Close"));
00379 closeAct->setShortcut(tr("Ctrl+Shift+c"));
00380
00381 connect(zapAct, SIGNAL(triggered()), this, SLOT(zapSelection()));
00382 connect(delAct, SIGNAL(triggered()), this, SLOT(delSelection()));
00383 connect(plotAct, SIGNAL(triggered()), this, SLOT(plotSelection()));
00384 connect(scanAct, SIGNAL(triggered()), this, SLOT(scanSelection()));
00385 connect(saveAct, SIGNAL(triggered()), this, SLOT(saveSelection()));
00386 connect(saveAllAct, SIGNAL(triggered()), this, SLOT(saveAll()));
00387 connect(closeAct, SIGNAL(triggered()), this, SLOT(close()));
00388
00389 menu.exec(event->globalPos());
00390 }
00391
00392 void DGVTable::createConnections()
00393 {
00394
00395 }