#define DISABLE_NEPOMUK_LEGACY
#include <nepomuk/andterm.h>
-#include <nepomuk/query.h>
+#include <nepomuk/filequery.h>
+#include <nepomuk/orterm.h>
#include <nepomuk/queryparser.h>
-#include <nepomuk/term.h>
+#include <nepomuk/resourcetypeterm.h>
+#include <nepomuk/literalterm.h>
+
+#include "nfo.h"
#include <kcombobox.h>
#include <kdialog.h>
#include <kseparator.h>
#include "searchcriterionselector.h"
+#include "searchoptiondialogbox.h"
#include <QButtonGroup>
#include <QHBoxLayout>
{"Date", SearchCriterionSelector::Date},
{"Size", SearchCriterionSelector::Size},
{"Tag", SearchCriterionSelector::Tag},
- {"Raging", SearchCriterionSelector::Rating}
+ {"Rating", SearchCriterionSelector::Rating}
};
DolphinSearchOptionsConfigurator::DolphinSearchOptionsConfigurator(QWidget* parent) :
QWidget(parent),
m_initialized(false),
+ m_directory(),
m_locationBox(0),
m_whatBox(0),
m_addSelectorButton(0),
m_locationBox = new KComboBox(this);
for (unsigned int i = 0; i < sizeof(g_locationItems) / sizeof(SettingsItem); ++i) {
- m_locationBox->addItem(g_locationItems[i].text);
+ m_locationBox->addItem(i18nc("@label", g_locationItems[i].text));
}
// add "what" configuration
m_whatBox = new KComboBox(this);
for (unsigned int i = 0; i < sizeof(g_whatItems) / sizeof(SettingsItem); ++i) {
- m_whatBox->addItem(g_whatItems[i].text);
+ m_whatBox->addItem(i18nc("@label", g_whatItems[i].text));
}
+ connect(m_whatBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateButtons()));
// add "Add selector" button
m_addSelectorButton = new QPushButton(this);
SearchSettings::self()->writeConfig();
}
-KUrl DolphinSearchOptionsConfigurator::nepomukUrl() const
+QString DolphinSearchOptionsConfigurator::customSearchQuery() const
{
- Nepomuk::Query::Query query;
- if (m_criteria.size() == 1) {
- query.setTerm(m_criteria.first()->queryTerm());
- } else {
- Nepomuk::Query::AndTerm andTerm;
- foreach (const SearchCriterionSelector* criterion, m_criteria) {
- const Nepomuk::Query::Term term = criterion->queryTerm();
- andTerm.addSubTerm(term);
- }
- query.setTerm(andTerm);
- }
+ return m_customSearchQuery;
+}
- Nepomuk::Query::Query customQuery = Nepomuk::Query::QueryParser::parseQuery(m_customSearchQuery);
- if (customQuery.isValid()) {
- query.setTerm(Nepomuk::Query::AndTerm(query.term(), customQuery.term()));
- }
- return query.toSearchUrl();
+KUrl DolphinSearchOptionsConfigurator::directory() const
+{
+ return m_directory;
+}
+
+KUrl DolphinSearchOptionsConfigurator::nepomukSearchUrl() const
+{
+ const Nepomuk::Query::Query query = nepomukQuery();
+ if ( query.isValid() ) {
+ return query.toSearchUrl( i18nc( "@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.",
+ "Query Results from '%1'",
+ customSearchQuery() ) );
+ }
+ else {
+ return KUrl();
+ }
}
void DolphinSearchOptionsConfigurator::setCustomSearchQuery(const QString& searchQuery)
{
m_customSearchQuery = searchQuery.simplified();
+ updateButtons();
+}
- const bool enabled = hasSearchParameters();
- m_searchButton->setEnabled(enabled);
- m_saveButton->setEnabled(enabled);
+void DolphinSearchOptionsConfigurator::setDirectory(const KUrl& dir)
+{
+ if (dir.protocol() != QString::fromLatin1("nepomuksearch")) {
+ m_directory = dir;
+ }
}
void DolphinSearchOptionsConfigurator::showEvent(QShowEvent* event)
addCriterion(selector);
}
-void DolphinSearchOptionsConfigurator::slotCriterionChanged()
-{
- const bool enabled = hasSearchParameters();
- m_searchButton->setEnabled(enabled);
- m_saveButton->setEnabled(enabled);
-}
-
void DolphinSearchOptionsConfigurator::removeCriterion()
{
SearchCriterionSelector* criterion = qobject_cast<SearchCriterionSelector*>(sender());
criterion->deleteLater();
- updateSelectorButton();
-}
-
-void DolphinSearchOptionsConfigurator::updateSelectorButton()
-{
- const int selectors = m_vBoxLayout->count() - 1;
- m_addSelectorButton->setEnabled(selectors < 10);
+ updateButtons();
}
void DolphinSearchOptionsConfigurator::saveQuery()
{
- // TODO: provide a custom dialog class for KDE 4.5, which
- // enables/disables the OK button depend on whether a text
- // has been entered.
- QPointer<KDialog> dialog = new KDialog(0, Qt::Dialog);
-
- QWidget* container = new QWidget(dialog);
-
- QLabel* label = new QLabel(i18nc("@label", "Name:"), container);
- KLineEdit* lineEdit = new KLineEdit(container);
- lineEdit->setMinimumWidth(250);
-
- QHBoxLayout* layout = new QHBoxLayout(container);
- layout->addWidget(label, Qt::AlignRight);
- layout->addWidget(lineEdit);
-
- dialog->setMainWidget(container);
- dialog->setCaption(i18nc("@title:window", "Save Search Options"));
- dialog->setButtons(KDialog::Ok | KDialog::Cancel);
- dialog->setDefaultButton(KDialog::Ok);
- dialog->setButtonText(KDialog::Ok, i18nc("@action:button", "Save"));
-
- KConfigGroup dialogConfig(KSharedConfig::openConfig("dolphinrc"),
- "SaveSearchOptionsDialog");
- dialog->restoreDialogSize(dialogConfig);
- if ((dialog->exec() == QDialog::Accepted) && !lineEdit->text().isEmpty()) {
+ QPointer<SearchOptionDialogBox> dialog = new SearchOptionDialogBox( 0 );
+
+ if (dialog->exec() == QDialog::Accepted) {
KFilePlacesModel* model = DolphinSettings::instance().placesModel();
- model->addPlace(lineEdit->text(), nepomukUrl());
+ model->addPlace(dialog->text(), nepomukSearchUrl());
}
delete dialog;
}
+void DolphinSearchOptionsConfigurator::updateButtons()
+{
+ const bool enable = nepomukQuery().isValid();
+ m_searchButton->setEnabled(enable);
+ m_saveButton->setEnabled(enable);
+
+ const int selectors = m_vBoxLayout->count() - 1;
+ m_addSelectorButton->setEnabled(selectors < 10);
+}
+
void DolphinSearchOptionsConfigurator::addCriterion(SearchCriterionSelector* criterion)
{
connect(criterion, SIGNAL(removeCriterion()), this, SLOT(removeCriterion()));
- connect(criterion, SIGNAL(criterionChanged()), this, SLOT(slotCriterionChanged()));
+ connect(criterion, SIGNAL(criterionChanged()), this, SLOT(updateButtons()));
// insert the new selector before the KSeparator at the bottom
const int index = m_vBoxLayout->count() - 1;
m_vBoxLayout->insertWidget(index, criterion);
- updateSelectorButton();
+ updateButtons();
m_criteria.append(criterion);
}
-bool DolphinSearchOptionsConfigurator::hasSearchParameters() const
+Nepomuk::Query::Query DolphinSearchOptionsConfigurator::nepomukQuery() const
{
- if (!m_customSearchQuery.isEmpty()) {
- // performance optimization: if a custom search query is defined,
- // there is no need to call the (quite expensive) method nepomukUrl()
- return true;
+ Nepomuk::Query::AndTerm andTerm;
+
+ // add search criterion terms
+ foreach (const SearchCriterionSelector* criterion, m_criteria) {
+ const Nepomuk::Query::Term term = criterion->queryTerm();
+ andTerm.addSubTerm(term);
+ }
+
+ bool addCustomQuery = true;
+
+ // filter result by the "What" filter
+ switch (m_whatBox->currentIndex()) {
+ case 1: {
+ // Image
+ const Nepomuk::Query::ResourceTypeTerm image(Nepomuk::Vocabulary::NFO::Image());
+ andTerm.addSubTerm(image);
+ break;
}
- return true; //nepomukUrl().path() != QLatin1String("/");
+ case 2: {
+ // Text
+ const Nepomuk::Query::ResourceTypeTerm textDocument(Nepomuk::Vocabulary::NFO::TextDocument());
+ andTerm.addSubTerm(textDocument);
+ break;
+ }
+ case 3: {
+ // Filenames
+ // trueg: Restriction to filename differs a bit from restriction to a type of file since it does not add a condition
+ // on the query but influences the text edited in the search bar directly.
+ // This is a bit tricky as we need to use the search bar text as plain text value for filename searches
+ // We do it the ugly way assuming the user only entered a literal value.
+ Nepomuk::Query::ComparisonTerm filenameTerm(Nepomuk::Vocabulary::NFO::fileName(), Nepomuk::Query::LiteralTerm(m_customSearchQuery));
+ andTerm.addSubTerm(filenameTerm);
+ addCustomQuery = false;
+ }
+ default: break;
+ }
+
+ if (addCustomQuery) {
+ // add custom query term from the searchbar
+ const Nepomuk::Query::Query customQuery = Nepomuk::Query::QueryParser::parseQuery(m_customSearchQuery);
+ if (customQuery.isValid()) {
+ andTerm.addSubTerm(customQuery.term());
+ }
+ }
+
+ Nepomuk::Query::FileQuery fileQuery;
+ fileQuery.setFileMode( Nepomuk::Query::FileQuery::QueryFiles );
+ fileQuery.setTerm(andTerm);
+
+ if ((m_locationBox->currentIndex() == 1) && m_directory.isValid()) {
+ // "From Here" is selected as location filter
+ fileQuery.addIncludeFolder(m_directory);
+ }
+
+ return fileQuery;
}
#include "dolphinsearchoptionsconfigurator.moc"