11 #include "CnetEditorWidget.h"
14 #include <QApplication>
17 #include <QCloseEvent>
20 #include <QHBoxLayout>
21 #include <QHeaderView>
22 #include <QItemSelection>
24 #include <QMessageBox>
25 #include <QModelIndex>
26 #include <QScrollArea>
31 #include <QStringList>
35 #include <QVBoxLayout>
39 #include "AbstractMeasureItem.h"
40 #include "AbstractPointItem.h"
41 #include "AbstractTreeItem.h"
42 #include "CnetDisplayProperties.h"
43 #include "CnetEditorSortConfigDialog.h"
45 #include "ControlMeasure.h"
46 #include "ControlNet.h"
47 #include "ControlPoint.h"
49 #include "FilterWidget.h"
50 #include "IException.h"
51 #include "ImageImageTreeModel.h"
52 #include "ImagePointTreeModel.h"
53 #include "MeasureTableModel.h"
54 #include "PointMeasureTreeModel.h"
55 #include "PointTableModel.h"
57 #include "TableView.h"
58 #include "TableViewHeader.h"
60 #include "XmlStackedHandler.h"
61 #include "XmlStackedHandlerReader.h"
77 CnetEditorWidget::CnetEditorWidget(Control *control, QString pathForSettings) {
89 connect(CnetDisplayProperties::getInstance(), SIGNAL(compositionFinished()),
96 setLayout(mainLayout);
104 installEventFilter(
this);
221 bool ignoreAll =
false;
224 item->deleteSource();
227 QString message = e.
what();
230 if (item == itemsToDelete.last()) {
231 QMessageBox::warning(
232 this,
"Failed to delete row", message, QMessageBox::Ok);
235 message +=
"\n\nOkay to continue?";
237 QMessageBox::StandardButton status = QMessageBox::warning(
238 this,
"Failed to delete row", message, QMessageBox::Yes |
239 QMessageBox::YesToAll | QMessageBox::No);
241 if (status == QMessageBox::YesToAll)
243 else if (status == QMessageBox::No)
283 QHBoxLayout *pointTableLayout =
new QHBoxLayout;
289 QHBoxLayout *measureTableLayout =
new QHBoxLayout;
297 QBoxLayout *mainLayout =
new QHBoxLayout;
311 FileName(
"$ISISROOT/appdata/images/icons/ice.png").expanded()),
312 tr(
"&Freeze Tables"),
this);
313 freezeTablesAct->setCheckable(
true);
314 freezeTablesAct->setToolTip(tr(
"Freeze tables (filters will not take "
315 "effect until unfrozen)"));
316 freezeTablesAct->setStatusTip(tr(
"Freeze tables (filters will not take "
317 "effect until unfrozen)"));
318 freezeTablesAct->setWhatsThis(tr(
"<html>When frozen, the contents of the "
319 "tables will be locked. Current filters will not be applied to the "
320 "tables until they are unfrozen.</html>"));
321 connect(freezeTablesAct, SIGNAL(toggled(
bool)),
324 freezeTablesLocation.append(tr(
"&Tables"));
325 m_menuActions->insert(freezeTablesAct, freezeTablesLocation);
328 FileName(
"$ISISROOT/appdata/images/icons/sort.png").expanded()),
329 tr(
"&Sorting Options..."),
this);
330 QString configureSortToolTipText = tr(
"Configure table sorting options");
331 configureSortAct->setToolTip(configureSortToolTipText);
332 configureSortAct->setStatusTip(configureSortToolTipText);
333 configureSortAct->setWhatsThis(tr(
"<html>Click here to configure options "
334 "related to the sorting of table columns.</html>"));
335 connect(configureSortAct, SIGNAL(triggered()),
338 configureSortLocation.append(tr(
"&Tables"));
339 m_menuActions->insert(configureSortAct, configureSortLocation);
341 QAction *whatsThisAct = QWhatsThis::createAction(
this);
343 whatsThisLocation.append(tr(
"&Help"));
347 tbActionList.append(freezeTablesAct);
348 tbActionList.append(configureSortAct);
399 QHBoxLayout *pointFilterLayout =
new QHBoxLayout;
400 pointFilterLayout->addWidget(pointFilter);
402 pointArea->setLayout(pointFilterLayout);
403 QScrollArea *pointFilterScrollArea =
new QScrollArea;
404 pointFilterScrollArea->setWidget(pointArea);
405 pointFilterScrollArea->setWidgetResizable(
true);
413 QHBoxLayout *serialFilterLayout =
new QHBoxLayout;
414 serialFilterLayout->addWidget(serialFilter);
416 serialArea->setLayout(serialFilterLayout);
417 QScrollArea *serialFilterScrollArea =
new QScrollArea;
418 serialFilterScrollArea->setWidget(serialArea);
419 serialFilterScrollArea->setWidgetResizable(
true);
427 QHBoxLayout *connectionFilterLayout =
new QHBoxLayout;
428 connectionFilterLayout->addWidget(connectionFilter);
430 connectionArea->setLayout(connectionFilterLayout);
431 QScrollArea *connectionFilterScrollArea =
new QScrollArea;
432 connectionFilterScrollArea->setWidget(connectionArea);
433 connectionFilterScrollArea->setWidgetResizable(
true);
446 "point. Each column in the table is an attribute of a control "
447 "point.<br/><br/>Cells that are gray are not editable.</html>");
449 this, SIGNAL(cnetModified()));
465 this, SIGNAL(editControlPoint(
ControlPoint *, QString)));
467 for (
int i = 0; i < AbstractPointItem::COLS; i++) {
469 AbstractPointItem::getColumnName((AbstractPointItem::Column) i),
this);
470 act->setCheckable(
true);
476 Qt::ActionsContextMenu);
486 "m_measureTableView");
488 "measure. Each column in the table is an attribute of a control "
489 "measure.<br/><br/>Rows with bold text are reference measures. "
490 "Cells that are gray are not editable.</html>");
504 this, SIGNAL(cnetModified()));
518 this, SIGNAL(editControlPoint(
ControlPoint *, QString)));
520 for (
int i = 0; i < AbstractMeasureItem::COLS; i++) {
522 (AbstractMeasureItem::Column) i),
this);
523 act->setCheckable(
true);
529 Qt::ActionsContextMenu);
548 for (
int i = 0; i < actions.size(); i++) {
550 actions[i]->isChecked());
561 for (
int i = 0; i < actions.size(); i++)
563 actions[i]->isChecked());
577 int visibleRows,
int totalRows) {
579 "Control Point Table");
593 int visibleRows,
int totalRows) {
595 "Control Measure Table");
608 int visibleRows,
int totalRows, QGroupBox *box, QString initialText) {
610 QString newTitle = initialText +
" (";
611 if (visibleRows > -1)
612 newTitle += QString::number(visibleRows);
616 newTitle +=
" / " + QString::number(totalRows) +
")";
618 box->setTitle(newTitle);
647 m_mainSplitter->restoreState(settings.value(
"mainSplitter").toByteArray());
653 for (
int i = 0; i < actions.size(); i++) {
655 AbstractMeasureItem::getColumnName((AbstractMeasureItem::Column) i);
656 key.replace(
" ",
"_");
657 actions[i]->setChecked(settings.value(key,
true).toBool());
661 for (
int i = 0; i < actions.size(); i++) {
663 AbstractPointItem::getColumnName((AbstractPointItem::Column) i);
664 key.replace(
" ",
"_");
665 actions[i]->setChecked(settings.value(key,
true).toBool());
670 settings.value(
"measureTableSortingEnabled",
true).toBool());
672 settings.value(
"measureTableSortLimit", 500000).toInt());
674 settings.value(
"pointTableSortingEnabled",
true).toBool());
676 settings.value(
"pointTableSortLimit", 100000).toInt());
689 settings.setValue(
"version",
VERSION);
696 for (
int i = 0; i < actions.size(); i++) {
698 AbstractMeasureItem::getColumnName((AbstractMeasureItem::Column) i);
699 key.replace(
" ",
"_");
700 settings.setValue(key, actions[i]->isChecked());
704 for (
int i = 0; i < actions.size(); i++) {
706 AbstractPointItem::getColumnName((AbstractPointItem::Column) i);
707 key.replace(
" ",
"_");
708 settings.setValue(key, actions[i]->isChecked());
712 settings.setValue(
"measureTableSortingEnabled",
714 settings.setValue(
"measureTableSortLimit",
716 settings.setValue(
"pointTableSortingEnabled",
718 settings.setValue(
"pointTableSortLimit",
864 AbstractTreeModel::MeasureItems | AbstractTreeModel::PointItems,
true);
871 if (networkItems.isEmpty()) {
875 for (
int measureIndex = 0;
876 measureIndex < cp->GetNumMeasures();
878 cp->
GetMeasure(measureIndex)->SetEditLock(
false);
883 else if (networkItems.last()->getPointerType() ==
884 AbstractTreeItem::Point) {
891 for (
int measureIndex = 0;
892 measureIndex < cp->GetNumMeasures();
894 cp->
GetMeasure(measureIndex)->SetEditLock(
false);
900 networkItems.removeLast();
903 else if (networkItems.last()->getPointerType() ==
904 AbstractTreeItem::Measure) {
909 if (cp->
GetId() != networkItemsCm->Parent()->
GetId()) {
912 for (
int measureIndex = 0;
913 measureIndex < cp->GetNumMeasures();
915 cp->
GetMeasure(measureIndex)->SetEditLock(
false);
922 for (
int measureIndex = cp->GetNumMeasures() - 1;
923 networkItemsCm && measureIndex >= 0;
928 cm->SetEditLock(
false);
932 networkItems.removeLast();
933 networkItemsCm = NULL;
935 if (networkItems.last()->getPointerType() ==
936 AbstractTreeItem::Measure) {