void ImportOptionsDlg::setCurrentDataset(ImportDescriptor* pImportDescriptor) { if (pImportDescriptor == NULL) { return; } if (pImportDescriptor == mpCurrentDataset) { return; } // Apply changes to the current data set if necessary bool bSuccess = true; if ((mpCurrentDataset != NULL) && (mEditDataDescriptorModified == true)) { if (mPromptForChanges == true) { int iReturn = QMessageBox::question(this, APP_NAME, "Apply changes to data?", QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::Cancel); if ((iReturn == QMessageBox::Yes) || (iReturn == QMessageBox::YesToAll)) { bSuccess = applyChanges(); if (iReturn == QMessageBox::YesToAll) { mPromptForChanges = false; } } else if (iReturn == QMessageBox::No) { // Update the validation icon for the original data descriptor validateDataset(mpCurrentDataset->getDataDescriptor()); } else if (iReturn == QMessageBox::Cancel) { bSuccess = false; } } else { bSuccess = applyChanges(); } } if (bSuccess == false) { // Select the tree widget item for the previously selected data set selectCurrentDatasetItem(); return; } mpCurrentDataset = pImportDescriptor; // Destroy the existing edit data descriptor if necessary Service<ModelServices> pModel; if (mpEditDescriptor != NULL) { Classification* pClassification = mpEditDescriptor->getClassification(); if (pClassification != NULL) { VERIFYNR(pClassification->detach(SIGNAL_NAME(Subject, Modified), Slot(this, &ImportOptionsDlg::editClassificationModified))); } RasterDataDescriptor* pRasterDescriptor = dynamic_cast<RasterDataDescriptor*>(mpEditDescriptor); if (pRasterDescriptor != NULL) { VERIFYNR(pRasterDescriptor->detach(SIGNAL_NAME(RasterDataDescriptor, RowsChanged), Slot(this, &ImportOptionsDlg::editDataDescriptorRowsModified))); VERIFYNR(pRasterDescriptor->detach(SIGNAL_NAME(RasterDataDescriptor, ColumnsChanged), Slot(this, &ImportOptionsDlg::editDataDescriptorColumnsModified))); VERIFYNR(pRasterDescriptor->detach(SIGNAL_NAME(RasterDataDescriptor, BandsChanged), Slot(this, &ImportOptionsDlg::editDataDescriptorBandsModified))); } RasterFileDescriptor* pRasterFileDescriptor = dynamic_cast<RasterFileDescriptor*>(mpEditDescriptor->getFileDescriptor()); if (pRasterFileDescriptor != NULL) { VERIFYNR(pRasterFileDescriptor->detach(SIGNAL_NAME(RasterFileDescriptor, RowsChanged), Slot(this, &ImportOptionsDlg::editFileDescriptorRowsModified))); VERIFYNR(pRasterFileDescriptor->detach(SIGNAL_NAME(RasterFileDescriptor, ColumnsChanged), Slot(this, &ImportOptionsDlg::editFileDescriptorColumnsModified))); VERIFYNR(pRasterFileDescriptor->detach(SIGNAL_NAME(RasterFileDescriptor, BandsChanged), Slot(this, &ImportOptionsDlg::editFileDescriptorBandsModified))); } VERIFYNR(mpEditDescriptor->detach(SIGNAL_NAME(Subject, Modified), Slot(this, &ImportOptionsDlg::editDataDescriptorModified))); pModel->destroyDataDescriptor(mpEditDescriptor); mpEditDescriptor = NULL; mEditDataDescriptorModified = false; } // Create a new data descriptor to validate the user inputs DataDescriptor* pDescriptor = mpCurrentDataset->getDataDescriptor(); if (pDescriptor != NULL) { mpEditDescriptor = pDescriptor->copy(); } VERIFYNRV(mpEditDescriptor != NULL); VERIFYNR(mpEditDescriptor->attach(SIGNAL_NAME(Subject, Modified), Slot(this, &ImportOptionsDlg::editDataDescriptorModified))); RasterDataDescriptor* pRasterDescriptor = dynamic_cast<RasterDataDescriptor*>(mpEditDescriptor); FileDescriptor* pFileDescriptor = mpEditDescriptor->getFileDescriptor(); RasterFileDescriptor* pRasterFileDescriptor = dynamic_cast<RasterFileDescriptor*>(pFileDescriptor); if (pRasterDescriptor != NULL) { VERIFYNR(pRasterDescriptor->attach(SIGNAL_NAME(RasterDataDescriptor, RowsChanged), Slot(this, &ImportOptionsDlg::editDataDescriptorRowsModified))); VERIFYNR(pRasterDescriptor->attach(SIGNAL_NAME(RasterDataDescriptor, ColumnsChanged), Slot(this, &ImportOptionsDlg::editDataDescriptorColumnsModified))); VERIFYNR(pRasterDescriptor->attach(SIGNAL_NAME(RasterDataDescriptor, BandsChanged), Slot(this, &ImportOptionsDlg::editDataDescriptorBandsModified))); } if (pRasterFileDescriptor != NULL) { VERIFYNR(pRasterFileDescriptor->attach(SIGNAL_NAME(RasterFileDescriptor, RowsChanged), Slot(this, &ImportOptionsDlg::editFileDescriptorRowsModified))); VERIFYNR(pRasterFileDescriptor->attach(SIGNAL_NAME(RasterFileDescriptor, ColumnsChanged), Slot(this, &ImportOptionsDlg::editFileDescriptorColumnsModified))); VERIFYNR(pRasterFileDescriptor->attach(SIGNAL_NAME(RasterFileDescriptor, BandsChanged), Slot(this, &ImportOptionsDlg::editFileDescriptorBandsModified))); } // Select the tree widget item for the current data set selectCurrentDatasetItem(); // Disconnect pages updateConnections(false); // Subset page if (pRasterFileDescriptor != NULL) { // Show the tab if necessary if (mpTabWidget->indexOf(mpSubsetPage) == -1) { mpTabWidget->insertTab(2, mpSubsetPage, "Subset"); } // Rows const vector<DimensionDescriptor>& rows = pRasterFileDescriptor->getRows(); const vector<DimensionDescriptor>& loadedRows = pRasterDescriptor->getRows(); mpSubsetPage->setRows(rows, loadedRows); // Columns const vector<DimensionDescriptor>& columns = pRasterFileDescriptor->getColumns(); const vector<DimensionDescriptor>& loadedColumns = pRasterDescriptor->getColumns(); mpSubsetPage->setColumns(columns, loadedColumns); // Bands const vector<DimensionDescriptor>& bands = pRasterFileDescriptor->getBands(); const vector<DimensionDescriptor>& selectedBands = pRasterDescriptor->getBands(); setSubsetBands(bands, selectedBands); // Initial bad band file directory if (pFileDescriptor != NULL) { QString strDirectory; string filename = pFileDescriptor->getFilename(); if (filename.empty() == false) { QFileInfo fileInfo(QString::fromStdString(filename)); strDirectory = fileInfo.absolutePath(); } mpSubsetPage->setBadBandFileDirectory(strDirectory); } } else { // Remove the subset page, since the file descriptor either isn't // present or isn't a RasterFileDescriptor, just a FileDescriptor int index = mpTabWidget->indexOf(mpSubsetPage); if (index != -1) { mpTabWidget->removeTab(index); } } // Data descriptor page - enable editing for all fields mpDataPage->setDataDescriptor(mpEditDescriptor, true); // File descriptor page bool editFilePage = false; if (pRasterFileDescriptor != NULL) { unsigned int numRows = pRasterFileDescriptor->getRowCount(); unsigned int numColumns = pRasterFileDescriptor->getColumnCount(); unsigned int bitsPerElement = pRasterFileDescriptor->getBitsPerElement(); unsigned int numBands = pRasterFileDescriptor->getBandCount(); if ((numRows == 0) || (numColumns == 0) || (numBands == 0) || (bitsPerElement == 0)) { editFilePage = true; } } mpFilePage->setFileDescriptor(pFileDescriptor, editFilePage); int iIndex = mpTabWidget->indexOf(mpFilePage); if (iIndex != -1) { if (pFileDescriptor == NULL) { mpTabWidget->removeTab(iIndex); } } else { if (pFileDescriptor != NULL) { mpTabWidget->insertTab(1, mpFilePage, "File"); } } // Classification page updateClassificationLabel(); Classification* pClassification = mpEditDescriptor->getClassification(); if (pClassification != NULL) { VERIFYNR(pClassification->attach(SIGNAL_NAME(Subject, Modified), Slot(this, &ImportOptionsDlg::editClassificationModified))); mpClassificationPage->setClassification(pClassification); } // Metadata page mpMetadataPage->setMetadata(mpEditDescriptor->getMetadata()); // Wavelengths page bool bWavelengthsPageActive = false; if (mpTabWidget->currentWidget() == mpWavelengthsPage) { bWavelengthsPageActive = true; } int index = mpTabWidget->indexOf(mpWavelengthsPage); if (index != -1) { mpTabWidget->removeTab(index); } if (pRasterFileDescriptor != NULL) { // Populate the wavelengths with the file descriptor bands since the metadata wavelengths // apply to all bands in the file mpWavelengthsPage->setWavelengths(pRasterFileDescriptor->getBands(), mpEditDescriptor->getMetadata()); if (pRasterDescriptor != NULL) { mpWavelengthsPage->highlightActiveBands(pRasterDescriptor->getBands()); } mpTabWidget->addTab(mpWavelengthsPage, "Wavelengths"); if (bWavelengthsPageActive == true) { mpTabWidget->setCurrentWidget(mpWavelengthsPage); } } // Importer page bool bImporterPageActive = false; if (mpImporterPage != NULL) { if (mpTabWidget->currentWidget() == mpImporterPage) { bImporterPageActive = true; } } removeImporterPage(); if (mpImporter != NULL) { mpImporterPage = mpImporter->getImportOptionsWidget(mpEditDescriptor); if (mpImporterPage != NULL) { QLayout* pLayout = mpImporterPage->layout(); if (pLayout != NULL) { if (pLayout->margin() <= 0) { pLayout->setMargin(10); } } QString strCaption = mpImporterPage->windowTitle(); if (strCaption.isEmpty() == true) { strCaption = "Importer"; } mpTabWidget->addTab(mpImporterPage, strCaption); if (bImporterPageActive == true) { mpTabWidget->setCurrentWidget(mpImporterPage); } } // Set the valid processing locations on the data page. This must be done after getting the import options // widget from the importer so that the auto importer will correctly query the importer that is used. // This can be changed if the importer design (and auto importer) is modified to support valid processing // locations for a specific data set. vector<ProcessingLocation> locations; if (mpImporter->isProcessingLocationSupported(IN_MEMORY) == true) { locations.push_back(IN_MEMORY); } if (mpImporter->isProcessingLocationSupported(ON_DISK) == true) { locations.push_back(ON_DISK); } if (mpImporter->isProcessingLocationSupported(ON_DISK_READ_ONLY) == true) { locations.push_back(ON_DISK_READ_ONLY); } mpDataPage->setValidProcessingLocations(locations); } // Validate the current data descriptor validateEditDataset(); // Reconnect the pages updateConnections(true); // Notify connected objects emit currentDatasetChanged(mpCurrentDataset); }