1#include "TableMainWindow.h"
13#include <QTableWidget>
39 TableMainWindow::~TableMainWindow() {
44 void TableMainWindow::clear() {
53 QList<QListWidgetItem *> TableMainWindow::itemList()
const {
54 QList<QListWidgetItem *> result;
57 result =
p_listWidget->findItems(QString(
"*"), Qt::MatchWrap | Qt::MatchWildcard);
62 void TableMainWindow::resizeColumn(
int columnIndex) {
63 QHeaderView* header =
p_table->horizontalHeader();
65 QString columnName(
p_table->model()->headerData(columnIndex, Qt::Horizontal).toString());
67 if (columnName.isEmpty())
72 if (header->sectionResizeMode(columnIndex) == QHeaderView:: ResizeToContents) {
73 header->setSectionResizeMode(columnIndex, QHeaderView::Interactive);
76 header->setSectionResizeMode(columnIndex, QHeaderView::ResizeToContents);
88 setWindowFlags(Qt::Tool);
92 setWindowFlags(Qt::Dialog);
95 statusBar()->setSizeGripEnabled(
true);
97 p_table =
new QTableWidget(
this);
98 p_table->setAlternatingRowColors(
true);
100 QHeaderView* columnHeader =
p_table->horizontalHeader();
101 columnHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
102 connect ( columnHeader, SIGNAL( sectionPressed(
int) ),
103 this, SLOT( resizeColumn(
int) ) );
109 p_dock->setObjectName(
"dock");
110 p_dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
111 p_dock->setMinimumWidth(190);
114 addDockWidget(Qt::LeftDockWidgetArea,
p_dock, Qt::Vertical);
115 connect(
p_listWidget, SIGNAL(itemChanged(QListWidgetItem *)),
119 QMenuBar *menuBar = this->menuBar();
120 QMenu *fileMenu = menuBar->addMenu(
"&File");
123 p_save->setText(
"Save...");
124 p_save->setShortcut(Qt::CTRL + Qt::Key_S);
126 p_save->setDisabled(
true);
129 saveas->setText(
"Save As...");
130 connect(saveas, SIGNAL(triggered()),
this, SLOT(
saveAsTable()));
133 load->setText(
"Load...");
134 connect(load, SIGNAL(triggered()),
this, SLOT(
loadTable()));
137 del->setText(
"Delete Selected Row(s)");
138 del->setShortcut(Qt::Key_Delete);
139 connect(del, SIGNAL(triggered()),
this, SLOT(
deleteRows()));
142 clear->setText(
"Clear table");
143 clear->setShortcut(Qt::CTRL + Qt::Key_Delete);
144 connect(clear, SIGNAL(triggered()),
this, SLOT(
clearTable()));
147 close->setText(
"Close");
148 connect(close, SIGNAL(triggered()),
this, SLOT(hide()));
150 fileMenu->addAction(
p_save);
151 fileMenu->addAction(saveas);
152 fileMenu->addAction(load);
153 fileMenu->addAction(del);
154 fileMenu->addAction(clear);
155 fileMenu->addAction(close);
162#if defined(__APPLE__)
164 toolBar->setObjectName(
"ToolBar");
165 toolBar->addAction(
p_save);
166 toolBar->addAction(saveas);
167 toolBar->addAction(load);
168 toolBar->addAction(del);
169 toolBar->addAction(clear);
170 toolBar->addAction(close);
171 this->addToolBar(toolBar);
175 QMenu *viewMenu = menuBar->addMenu(
"&View");
177 cols->setText(
"Columns");
178 connect(cols, SIGNAL(triggered()),
p_dock, SLOT(show()));
179 viewMenu->addAction(cols);
180 this->setMenuBar(menuBar);
181 installEventFilter(
this);
192 this->statusBar()->showMessage(message);
209 const QString &menuText,
int insertAt,
210 Qt::Orientation o, QString toolTip) {
212 int startCol =
p_table->columnCount();
214 for(
int i = 0; !heading.section(
":", i, i).isEmpty(); i++) {
215 QString htext = heading.section(
":", i, i);
217 int destinationColumn = insertAt;
220 p_table->insertColumn(insertAt);
223 destinationColumn = startCol + i;
224 p_table->insertColumn(startCol + i);
226 QTableWidgetItem *header =
new QTableWidgetItem(htext);
229 if (o == Qt::Horizontal) {
230 p_table->setHorizontalHeaderItem(insertAt, header);
233 p_table->setVerticalHeaderItem(insertAt, header);
238 if (o == Qt::Horizontal) {
239 p_table->setHorizontalHeaderItem(startCol + i, header);
242 p_table->setVerticalHeaderItem(startCol + i, header);
246 p_table->setColumnWidth(destinationColumn,
247 QFontMetrics(header->font()).horizontalAdvance(header->text()) + 20);
252 int endCol =
p_table->columnCount() - 1;
255 if (!menuText.isEmpty()) {
256 QListWidgetItem *item =
new QListWidgetItem();
258 item->setText(menuText);
259 if (toolTip.isEmpty()) {
260 item->setToolTip(heading);
263 item->setToolTip(toolTip);
273 item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
292 if (this->isHidden()) {
299 int index = itemList().indexOf(item);
304 if (item->checkState() == Qt::Checked) {
305 p_table->setColumnHidden(col,
false);
309 p_table->setColumnHidden(col,
true);
328 int index = itemList().indexOf(item);
336 if (item->checkState() == Qt::Checked) {
337 p_table->setRowHidden(col,
false);
341 p_table->setRowHidden(col,
true);
360 bool vis =
p_table->isVisible();
395 if (
p_table->rowCount() == 0)
return;
396 for(
int r = 0; r <
p_table->rowCount(); r++) {
397 for(
int c = 0; c <
p_table->columnCount(); c++) {
398 p_table->item(r, c)->setText(
"");
402 p_table->scrollToItem(
p_table->item(0, 0), QAbstractItemView::PositionAtTop);
415 QList<QTableWidgetItem *> list =
p_table->selectedItems();
418 for(
int i = 0; i < list.size(); i++) {
434 for(
int r = 0; r <
p_table->rowCount(); r++) {
435 for(
int c = 0; c <
p_table->columnCount(); c++) {
453 if (!this->isVisible())
return;
455 for(
int c = 0; c <
p_table->columnCount(); c++) {
456 p_table->item(row, c)->setText(
"");
466 QString fn = QFileDialog::getSaveFileName((
QWidget *)parent(),
467 "Choose filename to save under",
469 "Text Files (*.txt)");
474 if (!fn.endsWith(
".txt")) {
475 filename = fn +
".txt";
502 QMessageBox::critical((
QWidget *)parent(),
503 "Error",
"Cannot open file, please check permissions");
505 p_save->setDisabled(
true);
515 for(
int i = 0; i <
p_table->columnCount(); i++) {
516 if (!
p_table->isColumnHidden(i)) {
517 QTableWidgetItem *header =
p_table->horizontalHeaderItem(i);
518 QString temp = header->text();
519 temp.replace(
"\n",
" ");
521 line = line +
"\"" + temp +
"\"";
525 line = line +
",\"" + temp +
"\"";
530 t << line << Qt::endl;
533 for(
int i = 0; i <
p_table->rowCount(); i++) {
538 for(
int j = 0; j <
p_table->columnCount(); j++) {
540 if (!
p_table->isColumnHidden(j)) {
541 if (
p_table->item(i, j) == 0)
break;
542 currentText =
p_table->item(i, j)->text();
545 line = line + currentText;
549 line = line +
"," + currentText;
554 if (line.split(
",", Qt::SkipEmptyParts).count() != 0)
555 t << line << Qt::endl;
572 QListWidgetItem *item,
bool defaultChecked) {
573 QSettings settings(settingsFileName(), QSettings::NativeFormat);
575 QString itemTitle =
"item-" + item->text();
576 Qt::CheckState defaultState = defaultChecked? Qt::Checked : Qt::Unchecked;
577 Qt::CheckState state = (Qt::CheckState)
578 settings.value(itemTitle, defaultState).toInt();
579 item->setCheckState(state);
590 QHeaderView *header =
p_table->horizontalHeader();
591 QSettings settings(settingsFileName(), QSettings::NativeFormat);
593 for (
int columnIndex = 0; columnIndex <
p_table->model()->columnCount(); columnIndex++) {
595 QString headerName =
p_table->model()->headerData(columnIndex, Qt::Horizontal).toString();
596 QString settingName =
"column-" + headerName;
597 QString value = settings.value(settingName,
"auto").toString();
599 if (value ==
"auto" || value ==
"0") {
600 header->setSectionResizeMode(columnIndex, QHeaderView::ResizeToContents);
603 int width = value.toInt();
605 header->setSectionResizeMode(columnIndex, QHeaderView::Interactive);
606 p_table->setColumnWidth(columnIndex, width);
626 QSettings settings(settingsFileName(), QSettings::NativeFormat);
628 foreach (QListWidgetItem *item, itemList()) {
629 QString itemTitle =
"item-" + item->text();
630 settings.setValue(itemTitle, item->checkState());
633 QHeaderView *header =
p_table->horizontalHeader();
634 for(
int columnIndex = 0; columnIndex <
p_table->model()->columnCount(); columnIndex++)
636 QString headerName =
p_table->model()->headerData(columnIndex, Qt::Horizontal).toString();
637 QString settingName =
"column-" + headerName;
639 if (header->sectionResizeMode(columnIndex) == QHeaderView::ResizeToContents)
641 settings.setValue(settingName,
"auto");
645 settings.setValue( settingName, header->sectionSize(columnIndex) );
657 QString fn = QFileDialog::getOpenFileName((
QWidget *)parent(),
658 "Select file to load",
660 "Text Files (*.txt)");
663 if (fn.isEmpty())
return;
670 QMessageBox::critical((
QWidget *)parent(),
671 "Error",
"Cannot open file, please check permissions");
673 p_save->setDisabled(
true);
679 QList<int> column = QList<int>();
688 temp.remove(
"Positive ");
694 for(
int i = 0; i < list.count(); i++) {
695 for(
int j = 0; j < itemList().size(); j++) {
696 QListWidgetItem *item = itemList()[j];
699 if (item->text() ==
"Ground Range" && (list[i] ==
"Start Latitude" || list[i] ==
"Start Longitude" ||
700 list[i] ==
"End Latitude" || list[i] ==
"End Longitude")) {
701 item->setCheckState(Qt::Checked);
704 if (item->text() ==
"Pixel Range" && (list[i] ==
"Start Sample" || list[i] ==
"Start Line" ||
705 list[i] ==
"End Sample" || list[i] ==
"End Line")) {
706 item->setCheckState(Qt::Checked);
709 if (item->text() ==
"Pixel Range" && (list[i] ==
"Sample" || list[i] ==
"Line")) {
710 item->setCheckState(Qt::Checked);
713 if (item->text() ==
"Sample:Line" && (list[i] ==
"Sample" || list[i] ==
"Line")) {
714 item->setCheckState(Qt::Checked);
717 if (item->text() ==
"Planetocentric Lat" && list[i] ==
"Planetocentric Latitude") {
718 item->setCheckState(Qt::Checked);
721 if (item->text() ==
"Planetographic Lat" && list[i] ==
"Planetographic Latitude") {
722 item->setCheckState(Qt::Checked);
725 if (item->text() ==
"Projected X:Projected Y" && (list[i] ==
"Projected X" || list[i] ==
"Projected Y")) {
726 item->setCheckState(Qt::Checked);
729 if (item->text() ==
"Radius" && list[i] ==
"Local Radius") {
730 item->setCheckState(Qt::Checked);
733 if (item->text() ==
"XYZ" && (list[i] ==
"Point X" || list[i] ==
"Point Y" || list[i] ==
"Point Z")) {
734 item->setCheckState(Qt::Checked);
737 if (item->text() ==
"Ra:Dec" && (list[i] ==
"Right Ascension" || list[i] ==
"Declination")) {
738 item->setCheckState(Qt::Checked);
741 if (item->text() ==
"Spacecraft Position" && (list[i] ==
"Spacecraft X" || list[i] ==
"Spacecraft Y" || list[i] ==
"Spacecraft Z")) {
742 item->setCheckState(Qt::Checked);
745 if (item->text() ==
"Ephemeris Time" && list[i] ==
"Ephemeris Time") {
746 item->setCheckState(Qt::Checked);
749 if (item->text() ==
"Local Solar Time" && list[i] ==
"Local Solar Time") {
750 item->setCheckState(Qt::Checked);
753 if (item->text() ==
"Segments Sum" && list[i] ==
"Segments Sum km") {
754 item->setCheckState(Qt::Checked);
760 if (item->text() == list[i]) {
761 item->setCheckState(Qt::Checked);
768 for(
int cols = 0; cols <
p_table->columnCount(); cols++) {
769 QString header =
p_table->horizontalHeaderItem(cols)->text();
771 header.remove(
"Positive");
777 if (header == list[i]) {
778 column.push_back(cols);
784 if (!match) column.push_back(-1);
790 while(str.count() != 0) {
794 for(
int c = 0; c <
p_table->columnCount(); c++) {
795 QTableWidgetItem *item =
new QTableWidgetItem(
"");
797 if (c == 0)
p_table->scrollToItem(item);
805 for(
int i = 0; i < column.size(); i++) {
806 QTableWidgetItem *newItem =
new QTableWidgetItem(list[i]);
807 if (column[i] != -1) {
819 this->setWindowTitle(
p_title +
" : " + fn);
833 case QEvent::Close: {
Base class for the Qisis main windows.
virtual void closeEvent(QCloseEvent *event)
This method is overridden so that we can be sure to write the current settings of the Main window.
virtual void readSettings(QSize defaultSize=QSize())
This method ensure that the settings get written even if the Main window was only hidden,...
bool p_trackItems
Boolean to track items.
void loadTable()
This method loads a text file into the table.
void showTable()
This method checks to see if the table has been created.
void addToTable(bool setOn, const QString &heading, const QString &menuText="", int insertAt=-1, Qt::Orientation o=Qt::Horizontal, QString toolTip="")
Adds a new column to the table when a new curve is added to the plot.
QPointer< QListWidget > p_listWidget
List widget.
void setCurrentRow(int row)
Sets the current row to row.
void fileLoaded()
Signal emitted when a file has loaded.
bool eventFilter(QObject *o, QEvent *e)
This event filter is installed in the constructor.
void createTable()
This creates the table main window.
QTableWidget * p_table
The table.
int p_currentIndex
Current index.
void writeSettings() const
This overriden method is called when the Tablemainwindow is closed or hidden to write the size and lo...
void hideEvent(QHideEvent *event)
int p_visibleColumns
Number of visible columns.
QWidget * p_parent
The parent widget.
void clearTable()
This method clears all items from each row and column.
bool trackListItems()
Returns whether or not we should track items.
void readColumnSettings()
This method reads the columns in the table and sets their size to the appropriate size,...
QList< int > p_endColumn
List of end columns.
int currentIndex() const
Returns the current index.
void syncColumns()
This method hides and shows the columns according to which items the user has selected to be view-abl...
void setTrackListItems(bool track=false)
If this property is true, the class will keep track of the checked/unchecked items in the dock area w...
void deleteRows()
This method is called when the user selects a row or rows uses the delete button or selects the delet...
QString p_title
The title string.
QFile p_currentFile
The current file.
QDockWidget * p_dock
The dock widget.
int selectedRows() const
Returns the selected rows.
void closeEvent(QCloseEvent *event)
void clearRow(int row)
This method clears the text of the given row.
void deleteColumn(int item)
This method deletes a column from the table.
void syncRows()
Use this method to sync the table with the dock widget list if the table orientation is horizontal.
int p_currentRow
Current row.
void readItemSettings(QString heading, QListWidgetItem *item, bool defaultChecked)
This method reads the 'checked' settings on the items listed in the dock area which determine which t...
TableMainWindow(QString title, QWidget *parent=0)
Constructs a new TableMainWindow object.
void saveAsTable()
This method will select a file, set it as the current file and save the table.
void saveTable()
This method allows the user to save the data from the table to the current file.
QAction * p_save
Action to save the table to the current file.
void setCurrentIndex(int currentIndex)
Sets the current index to currentIndex.
void setStatusMessage(QString message)
sets the status message in the lower lefthand corner of the window.
QList< int > p_startColumn
List of start columns.
This is free and unencumbered software released into the public domain.