diff --git a/Code/Mantid/Framework/DataHandling/src/Load.cpp b/Code/Mantid/Framework/DataHandling/src/Load.cpp index 0ecf0eedebf18704c67e3657ce1b9e75da4f8d3b..cbbb53a107cc2910a73e3f3aa7a2b29c22999030 100644 --- a/Code/Mantid/Framework/DataHandling/src/Load.cpp +++ b/Code/Mantid/Framework/DataHandling/src/Load.cpp @@ -8,6 +8,7 @@ #include "MantidKernel/ArrayProperty.h" #include "MantidAPI/LoadAlgorithmFactory.h" #include "MantidAPI/AlgorithmManager.h" +#include "MantidKernel/FacilityInfo.h" namespace Mantid { @@ -199,21 +200,14 @@ namespace Mantid /// Initialisation method. void Load::init() { - - std::vector<std::string> exts; - exts.push_back(".raw"); - exts.push_back(".s*"); - exts.push_back(".add"); - - exts.push_back(".nxs"); - exts.push_back(".nx5"); + // Take extensions first from Facility object + const FacilityInfo & defaultFacility = Mantid::Kernel::ConfigService::Instance().Facility(); + std::vector<std::string> exts = defaultFacility.extensions(); + // Add in some other known extensions exts.push_back(".xml"); - exts.push_back(".n*"); - exts.push_back(".dat"); exts.push_back(".txt"); exts.push_back(".csv"); - exts.push_back(".spe"); declareProperty(new FileProperty("Filename", "", FileProperty::Load, exts), diff --git a/Code/Mantid/MantidQt/API/src/AlgorithmDialog.cpp b/Code/Mantid/MantidQt/API/src/AlgorithmDialog.cpp index 30575516b2e6add62e1a1eb7dd87cef6d93b606c..33e6003a75ffbf93f5124b2577bf4cc025ed1a8d 100644 --- a/Code/Mantid/MantidQt/API/src/AlgorithmDialog.cpp +++ b/Code/Mantid/MantidQt/API/src/AlgorithmDialog.cpp @@ -421,7 +421,6 @@ QString AlgorithmDialog::openFileDialog(const QString & propName) { // --------- Load a File ------------- filter = "Files ("; - std::set<std::string>::const_iterator iend = exts.end(); // Push a wild-card onto the front of each file suffix for( std::set<std::string>::const_iterator itr = exts.begin(); itr != iend; ++itr) @@ -439,15 +438,24 @@ QString AlgorithmDialog::openFileDialog(const QString & propName) else if ( prop->isSaveProperty() ) { // --------- Save a File ------------- - //Have each filter on a separate line - QString filter(""); + //Have each filter on a separate line with the default as the first + std::string defaultExt = prop->getDefaultExt(); + QString filter; + if( !defaultExt.empty() ) + { + filter = "*" + QString::fromStdString(defaultExt) + ";;"; + } std::set<std::string>::const_iterator iend = exts.end(); for( std::set<std::string>::const_iterator itr = exts.begin(); itr != iend; ++itr) { - filter.append("*"+QString::fromStdString(*itr) + ";;"); + if( (*itr) != defaultExt ) + { + filter.append("*"+QString::fromStdString(*itr) + ";;"); + } } //Remove last two semi-colons or else we get an extra empty option in the box filter.chop(2); + // Prepend the default filter QString selectedFilter; filename = QFileDialog::getSaveFileName(this, "Save file", AlgorithmInputHistory::Instance().getPreviousDirectory(), filter, &selectedFilter); diff --git a/Code/Mantid/MantidQt/CustomDialogs/src/LoadDialog.cpp b/Code/Mantid/MantidQt/CustomDialogs/src/LoadDialog.cpp index 87408c7b566357ab243764cb92545b4ede2a60c2..a52748795f848581fe43867da985340cee17ef8d 100644 --- a/Code/Mantid/MantidQt/CustomDialogs/src/LoadDialog.cpp +++ b/Code/Mantid/MantidQt/CustomDialogs/src/LoadDialog.cpp @@ -15,6 +15,7 @@ #include "MantidKernel/MaskedProperty.h" #include "MantidAPI/IWorkspaceProperty.h" #include "MantidAPI/FileProperty.h" +#include "MantidAPI/AlgorithmManager.h" namespace MantidQt { @@ -141,7 +142,8 @@ namespace MantidQt m_fileWidget->allowMultipleFiles(false); m_fileWidget->isOptional(false); m_fileWidget->doMultiEntry(false); - m_fileWidget->setAlgorithmProperty("Load"); // Slight hack to get only the all-files option in browse + m_fileWidget->setAlgorithmProperty("Load|Filename"); + m_fileWidget->extsAsSingleOption(false); m_fileWidget->readSettings("Mantid/Algorithms/Load"); QHBoxLayout *propLine = new QHBoxLayout; propLine->addWidget(m_fileWidget); diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWRunFiles.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWRunFiles.h index c19432c8e7665f04eceb7b2b30d237cd23ff8d39..6a80a46d3110672ec9969cdbcf38a06d3d510261 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWRunFiles.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWRunFiles.h @@ -53,6 +53,7 @@ namespace MantidQt Q_PROPERTY(ButtonOpts buttonOpt READ doButtonOpt WRITE doButtonOpt) Q_PROPERTY(QString algorithmAndProperty READ getAlgorithmProperty WRITE setAlgorithmProperty) Q_PROPERTY(QStringList fileExtensions READ getFileExtensions WRITE setFileExtensions) + Q_PROPERTY(bool extsAsSingleOption READ extsAsSingleOption WRITE extsAsSingleOption) Q_ENUMS(ButtonOpts) public: @@ -88,9 +89,11 @@ namespace MantidQt QString getAlgorithmProperty() const; void setAlgorithmProperty(const QString & name); QStringList getFileExtensions() const; + void setFileExtensions(const QStringList & extensions); + bool extsAsSingleOption() const; + void extsAsSingleOption(const bool value); bool isEmpty() const; QString getText() const; - void setFileExtensions(const QStringList & extensions); // Standard setters/getters bool isValid() const; @@ -159,6 +162,8 @@ namespace MantidQt QString m_algorithmProperty; /// The file extensions to look for QStringList m_fileExtensions; + /// If true the exts are displayed as one option in the dialog + bool m_extsAsSingleOption; /// The Ui form Ui::MWRunFiles m_uiForm; diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp index e9613355e51f6c623b3b2aa9fbd9dd187c689e06..2544dbe78cd38548fca9bbe8fa866aff9a905ae8 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp @@ -9,7 +9,7 @@ #include <QStringList> #include <QFileDialog> #include <QFileInfo> - +#include <QHash> #include "Poco/File.h" using namespace Mantid::Kernel; @@ -19,7 +19,8 @@ using namespace MantidQt::MantidWidgets; MWRunFiles::MWRunFiles(QWidget *parent) : MantidWidget(parent), m_findRunFiles(true), m_allowMultipleFiles(true), m_isOptional(false), m_buttonOpt(Text), m_multiEntry(false), m_fileProblem(""), - m_entryNumProblem(""), m_algorithmProperty(""), m_fileFilter("") + m_entryNumProblem(""), m_algorithmProperty(""), m_fileExtensions(), m_extsAsSingleOption(true), + m_fileFilter("") { m_uiForm.setupUi(this); @@ -212,6 +213,24 @@ void MWRunFiles::setFileExtensions(const QStringList & extensions) m_fileFilter.clear(); } +/** + * Returns whether the file dialog should display the exts as a single list or as multiple items + * @return boolean + */ +bool MWRunFiles::extsAsSingleOption() const +{ + return m_extsAsSingleOption; +} + +/** + * Sets whether the file dialog should display the exts as a single list or as multiple items + * @@param value :: If true the file dialog wil contain a single entry will all filters + */ +void MWRunFiles::extsAsSingleOption(const bool value) +{ + m_extsAsSingleOption = value; +} + /** * Is the input within the widget valid? * @returns True of the file names within the widget are valid, false otherwise @@ -483,19 +502,53 @@ QString MWRunFiles::createFileFilter() QString fileFilter; if( !fileExts.isEmpty() ) { - QStringListIterator itr(fileExts); - fileFilter += "Files ("; - while( itr.hasNext() ) + // The list may contain upper and lower cased versions, ensure these are on the same line + // I want this ordered + QList<QPair<QString, QStringList> > finalIndex; + QStringListIterator sitr(fileExts); + QString ext = sitr.next(); + finalIndex.append(qMakePair(ext.toUpper(), QStringList(ext))); + while( sitr.hasNext() ) + { + ext = sitr.next(); + QString key = ext.toUpper(); + bool found(false); + const size_t itemCount = finalIndex.count(); + for( size_t i = 0 ; i < itemCount; ++i ) + { + if( key == finalIndex[i].first ) + { + finalIndex[i].second.append(ext); + found = true; + break; + } + } + if( !found ) + { + finalIndex.append(qMakePair(key, QStringList(ext))); + } + } + + if( extsAsSingleOption() ) + { + fileFilter += "Files ("; + QListIterator<QPair<QString, QStringList> > itr(finalIndex); + while( itr.hasNext() ) + { + const QStringList values = itr.next().second; + fileFilter += "*" + values.join(" *"); + } + fileFilter += ");;"; + } + else { - QString ext = itr.next(); - fileFilter += "*" + ext; - if( itr.hasNext() ) + QListIterator<QPair<QString, QStringList> > itr(finalIndex); + while( itr.hasNext() ) { - fileFilter += " "; + const QStringList values = itr.next().second; + fileFilter += "Files (*" + values.join(" *") + ");;"; } } - fileFilter += ")"; - fileFilter += ";;"; } fileFilter += "All Files (*.*)"; return fileFilter;