]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/dolphinsearchbox.cpp
Merge remote-tracking branch 'origin/KDE/4.9'
[dolphin.git] / src / search / dolphinsearchbox.cpp
index 6664050146030cd081b1a18a9e4ccaf0b27d7502..8b660712a1abff9545499a6164892d62e734f41e 100644 (file)
 /***************************************************************************
- *   Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at>                  *
- *   Copyright (C) 2009 by Matthias Fuchs <mat69@gmx.net>                  *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
- ***************************************************************************/
+*    Copyright (C) 2010 by Peter Penz <peter.penz19@gmail.com>            *
+*                                                                         *
+*    This program is free software; you can redistribute it and/or modify *
+*    it under the terms of the GNU General Public License as published by *
+*    the Free Software Foundation; either version 2 of the License, or    *
+*    (at your option) any later version.                                  *
+*                                                                         *
+*    This program is distributed in the hope that it will be useful,      *
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of       *
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
+*    GNU General Public License for more details.                         *
+*                                                                         *
+*    You should have received a copy of the GNU General Public License    *
+*    along with this program; if not, write to the                        *
+*    Free Software Foundation, Inc.,                                      *
+*    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           *
+* **************************************************************************/
 
 #include "dolphinsearchbox.h"
 
-#include <config-nepomuk.h>
+#include "dolphin_searchsettings.h"
+#include "dolphinfacetswidget.h"
+#include "dolphinsearchinformation.h"
 
-#include <KConfigGroup>
-#include <KDesktopFile>
-#include <kglobalsettings.h>
-#include <klineedit.h>
-#include <klocale.h>
-#include <kiconloader.h>
-#include <KStandardDirs>
+#include <KIcon>
+#include <KLineEdit>
+#include <KLocale>
+#include <KSeparator>
 
+#include <QButtonGroup>
+#include <QDir>
 #include <QEvent>
-#include <QKeyEvent>
+#include <QFormLayout>
 #include <QHBoxLayout>
-#include <QStandardItemModel>
-#include <QtGui/QCompleter>
-#include <QtGui/QTreeView>
+#include <QKeyEvent>
+#include <QLabel>
+#include <QScrollArea>
+#include <QTimer>
 #include <QToolButton>
+#include <QVBoxLayout>
 
+#include <config-nepomuk.h>
 #ifdef HAVE_NEPOMUK
-#include <Nepomuk/ResourceManager>
-#include <Nepomuk/Tag>
+    #include <Nepomuk2/Query/AndTerm>
+    #include <Nepomuk2/Query/FileQuery>
+    #include <Nepomuk2/Query/LiteralTerm>
+    #include <Nepomuk2/Query/OrTerm>
+    #include <Nepomuk2/Query/Query>
+    #include <Nepomuk2/Query/QueryParser>
+    #include <Nepomuk2/Query/ResourceTypeTerm>
+    #include <Nepomuk2/Query/ComparisonTerm>
+    #include <Nepomuk2/ResourceManager>
+    #include <Nepomuk2/Vocabulary/NFO>
 #endif
 
-DolphinSearchCompleter::DolphinSearchCompleter(KLineEdit* linedit) :
-    QObject(0),
-    q(linedit),
-    m_completer(0),
-    m_completionModel(0),
-    m_wordStart(-1),
-    m_wordEnd(-1)
+DolphinSearchBox::DolphinSearchBox(QWidget* parent) :
+    QWidget(parent),
+    m_startedSearching(false),
+    m_readOnly(false),
+    m_topLayout(0),
+    m_searchLabel(0),
+    m_searchInput(0),
+    m_optionsScrollArea(0),
+    m_fileNameButton(0),
+    m_contentButton(0),
+    m_separator(0),
+    m_fromHereButton(0),
+    m_everywhereButton(0),
+    m_facetsToggleButton(0),
+    m_facetsWidget(0),
+    m_searchPath(),
+    m_readOnlyQuery(),
+    m_startSearchTimer(0)
 {
-    m_completionModel = new QStandardItemModel(this);
+}
 
-#ifdef HAVE_NEPOMUK
-    if (!Nepomuk::ResourceManager::instance()->init()) {
-        //read all currently set tags
-        //NOTE if the user changes tags elsewhere they won't get updated here
-        QList<Nepomuk::Tag> tags = Nepomuk::Tag::allTags();
-        foreach (const Nepomuk::Tag& tag, tags) {
-            const QString tagText = tag.label();
-            addCompletionItem(tagText,
-                              "tag:\"" + tagText + '\"',
-                              i18nc("Tag as in Nepomuk::Tag", "Tag"),
-                              QString(),
-                              KIcon("mail-tagged"));
-        }
-    }
-#endif //HAVE_NEPOMUK
-
-    // load the completions stored in the desktop file
-    KDesktopFile file(KStandardDirs::locate("data", "dolphin/dolphinsearchcommands.desktop"));
-    foreach (const QString &group, file.groupList()) {
-        KConfigGroup cg(&file, group);
-        const QString displayed = cg.readEntry("Name", QString());
-        const QString usedForCompletition = cg.readEntry("Completion", QString());
-        const QString description = cg.readEntry("Comment", QString());
-        const QString toolTip = cg.readEntry("GenericName", QString());
-        const QString icon = cg.readEntry("Icon", QString());
-
-        if (icon.isEmpty()) {
-            addCompletionItem(displayed, usedForCompletition, description, toolTip);
+DolphinSearchBox::~DolphinSearchBox()
+{
+    saveSettings();
+}
+
+void DolphinSearchBox::setText(const QString& text)
+{
+    m_searchInput->setText(text);
+}
+
+QString DolphinSearchBox::text() const
+{
+    return m_searchInput->text();
+}
+
+void DolphinSearchBox::setSearchPath(const KUrl& url)
+{
+    m_searchPath = url;
+
+    QFontMetrics metrics(m_fromHereButton->font());
+    const int maxWidth = metrics.height() * 8;
+
+    QString location = url.fileName();
+    if (location.isEmpty()) {
+        if (url.isLocalFile()) {
+            location = QLatin1String("/");
         } else {
-            addCompletionItem(displayed, usedForCompletition, description, toolTip, KIcon(icon));
+            location = url.protocol() + QLatin1String(" - ") + url.host();
         }
     }
 
-    m_completionModel->sort(0, Qt::AscendingOrder);
+    const QString elidedLocation = metrics.elidedText(location, Qt::ElideMiddle, maxWidth);
+    m_fromHereButton->setText(i18nc("action:button", "From Here (%1)", elidedLocation));
 
-    m_completer = new QCompleter(m_completionModel, this);
-    m_completer->setWidget(q);
-    m_completer->setCaseSensitivity(Qt::CaseInsensitive);
-    QTreeView *view = new QTreeView;
-    m_completer->setPopup(view);
-    view->setRootIsDecorated(false);
-    view->setHeaderHidden(true);
+    const bool showSearchFromButtons = url.isLocalFile() && !m_readOnly;
+    m_separator->setVisible(showSearchFromButtons);
+    m_fromHereButton->setVisible(showSearchFromButtons);
+    m_everywhereButton->setVisible(showSearchFromButtons);
 
-    connect(q, SIGNAL(textEdited(QString)), this, SLOT(slotTextEdited(QString)));
-    connect(m_completer, SIGNAL(highlighted(QModelIndex)), this, SLOT(highlighted(QModelIndex)));
+    const DolphinSearchInformation& searchInfo = DolphinSearchInformation::instance();
+    const bool hasFacetsSupport = searchInfo.isIndexingEnabled() && searchInfo.isPathIndexed(m_searchPath);
+    m_facetsWidget->setEnabled(hasFacetsSupport);
 }
 
-void DolphinSearchCompleter::addCompletionItem(const QString& displayed, const QString& usedForCompletition, const QString& description, const QString& toolTip, const KIcon& icon)
+KUrl DolphinSearchBox::searchPath() const
 {
-    if (displayed.isEmpty() || usedForCompletition.isEmpty()) {
-        return;
-    }
+    return m_searchPath;
+}
 
-    QList<QStandardItem*> items;
-    QStandardItem *item = new QStandardItem();
-    item->setData(QVariant(displayed), Qt::DisplayRole);
-    item->setData(QVariant(usedForCompletition), Qt::UserRole);
-    item->setData(QVariant(toolTip), Qt::ToolTipRole);
-    items << item;
+KUrl DolphinSearchBox::urlForSearching() const
+{
+    KUrl url;
+    const DolphinSearchInformation& searchInfo = DolphinSearchInformation::instance();
+    if (searchInfo.isIndexingEnabled() && searchInfo.isPathIndexed(m_searchPath)) {
+        url = nepomukUrlForSearching();
+    } else {
+        url.setProtocol("filenamesearch");
+        url.addQueryItem("search", m_searchInput->text());
+        if (m_contentButton->isChecked()) {
+            url.addQueryItem("checkContent", "yes");
+        }
 
-    item = new QStandardItem(description);
-    if (!icon.isNull()) {
-        item->setIcon(icon);
+        QString encodedUrl;
+        if (m_everywhereButton->isChecked()) {
+            // It is very unlikely, that the majority of Dolphins target users
+            // mean "the whole harddisk" instead of "my home folder" when
+            // selecting the "Everywhere" button.
+            encodedUrl = QDir::homePath();
+        } else {
+            encodedUrl = m_searchPath.url();
+        }
+        url.addQueryItem("url", encodedUrl);
     }
-    item->setData(QVariant(toolTip), Qt::ToolTipRole);
-    items << item;
 
-    m_completionModel->insertRow(m_completionModel->rowCount(), items);
+    return url;
 }
 
-void DolphinSearchCompleter::findText(int* wordStart, int* wordEnd, QString* newWord, int cursorPos, const QString &input)
+void DolphinSearchBox::selectAll()
 {
-    --cursorPos;//decrease to get a useful position (not the end of the word e.g.)
+    m_searchInput->selectAll();
+}
 
-    if (!wordStart || !wordEnd) {
-        return;
+void DolphinSearchBox::setReadOnly(bool readOnly, const KUrl& query)
+{
+    if (m_readOnly != readOnly) {
+        m_readOnly = readOnly;
+        m_readOnlyQuery = query;
+        applyReadOnlyState();
     }
+}
 
-    *wordStart = -1;
-    *wordEnd = -1;
-
-    // the word might contain "" and thus maybe spaces
-    if (input.contains('\"')) {
-        int tempStart = -1;
-        int tempEnd = -1;
-
-        do {
-            tempStart = input.indexOf('\"', tempEnd + 1);
-            tempEnd = input.indexOf('\"', tempStart + 1);
-            if ((cursorPos >= tempStart) && (cursorPos <= tempEnd)) {
-                *wordStart = tempStart;
-                *wordEnd = tempEnd;
-                break;
-            } else if ((tempEnd == -1) && (cursorPos >= tempStart)) {
-                //one " found, so probably the beginning of the new word
-                *wordStart = tempStart;
-                break;
-            }
-        } while ((tempStart != -1) && (tempEnd != -1));
-    }
+bool DolphinSearchBox::isReadOnly() const
+{
+    return m_readOnly;
+}
 
-    if (*wordEnd > -1) {
-        *wordEnd = input.indexOf(' ', *wordEnd) - 1;
-    } else {
-        *wordEnd = input.indexOf(' ', cursorPos) - 1;
-    }
-    if (*wordEnd < 0) {
-        *wordEnd = input.length() - 1;
+bool DolphinSearchBox::event(QEvent* event)
+{
+    if (event->type() == QEvent::Polish) {
+        init();
     }
+    return QWidget::event(event);
+}
 
-    if (*wordStart > -1) {
-        *wordStart = input.lastIndexOf(' ', *wordStart + 1) + 1;
-    } else {
-        *wordStart = input.lastIndexOf(' ', cursorPos) + 1;
+void DolphinSearchBox::showEvent(QShowEvent* event)
+{
+    if (!event->spontaneous()) {
+        m_searchInput->setFocus();
+        m_startedSearching = false;
     }
-    if (*wordStart < 0) {
-        *wordStart = 0;
+}
+
+void DolphinSearchBox::keyReleaseEvent(QKeyEvent* event)
+{
+    QWidget::keyReleaseEvent(event);
+    if (event->key() == Qt::Key_Escape) {
+        if (m_searchInput->text().isEmpty()) {
+            emit closeRequest();
+        } else {
+            m_searchInput->clear();
+        }
     }
+}
 
+void DolphinSearchBox::emitSearchRequest()
+{
+    m_startSearchTimer->stop();
+    m_startedSearching = true;
+    emit searchRequest();
+}
 
-    QString word = input.mid(*wordStart, *wordEnd - *wordStart + 1);
+void DolphinSearchBox::emitCloseRequest()
+{
+    m_startSearchTimer->stop();
+    m_startedSearching = false;
+    emit closeRequest();
+}
 
-    //remove opening braces or negations ('-' = not) at the beginning
-    while (word.count() && ((word[0] == '(') || (word[0] == '-'))) {
-        word.remove(0, 1);
-        ++(*wordStart);
+void DolphinSearchBox::slotConfigurationChanged()
+{
+    saveSettings();
+    if (m_startedSearching) {
+        emitSearchRequest();
     }
+}
 
-    //remove ending braces at the end
-    while (word.count() && (word[word.count() - 1] == ')')) {
-        word.remove(word.count() - 1, 1);
-        --(*wordEnd);
+void DolphinSearchBox::slotSearchTextChanged(const QString& text)
+{
+    if (text.isEmpty()) {
+        m_startSearchTimer->stop();
+    } else {
+        m_startSearchTimer->start();
     }
+    emit searchTextChanged(text);
+}
 
-    if (newWord) {
-        *newWord = word;
-    }
+void DolphinSearchBox::slotReturnPressed(const QString& text)
+{
+    emitSearchRequest();
+    emit returnPressed(text);
 }
 
-void DolphinSearchCompleter::slotTextEdited(const QString& text)
+void DolphinSearchBox::slotFacetsButtonToggled()
 {
-    findText(&m_wordStart, &m_wordEnd, &m_userText, q->cursorPosition(), text);
-
-    if (!m_userText.isEmpty()) {
-        const int role = m_completer->completionRole();
-
-        //change the role used for comparison depending on what the user entered
-        if (m_userText.contains(':') || m_userText.contains('\"')) {
-            //assume that m_userText contains searchinformation like 'tag:"..."'
-            if (role != Qt::UserRole) {
-                m_completer->setCompletionRole(Qt::UserRole);
-            }
-        } else if (role != Qt::EditRole) {
-            m_completer->setCompletionRole(Qt::EditRole);
-        }
+    const bool facetsIsVisible = !m_facetsWidget->isVisible();
+    m_facetsWidget->setVisible(facetsIsVisible);
+    updateFacetsToggleButton();
+}
 
-        m_completer->setCompletionPrefix(m_userText);
-        m_completer->complete();
-    }
+void DolphinSearchBox::slotFacetChanged()
+{
+    m_startedSearching = true;
+    m_startSearchTimer->stop();
+    emit searchRequest();
 }
 
-void DolphinSearchCompleter::highlighted(const QModelIndex& index)
+void DolphinSearchBox::initButton(QToolButton* button)
 {
-    QString text = q->text();
-    int wordStart;
-    int wordEnd;
+    button->setAutoExclusive(true);
+    button->setAutoRaise(true);
+    button->setCheckable(true);
+    connect(button, SIGNAL(clicked(bool)), this, SLOT(slotConfigurationChanged()));
+}
 
-    findText(&wordStart, &wordEnd, 0, q->cursorPosition(), text);
+void DolphinSearchBox::loadSettings()
+{
+    if (SearchSettings::location() == QLatin1String("Everywhere")) {
+        m_everywhereButton->setChecked(true);
+    } else {
+        m_fromHereButton->setChecked(true);
+    }
 
-    QString replace = index.sibling(index.row(), 0).data(Qt::UserRole).toString();
-    //show the originally entered text
-    if (replace.isEmpty()) {
-        replace = m_userText;
+    if (SearchSettings::what() == QLatin1String("Content")) {
+        m_contentButton->setChecked(true);
+    } else {
+        m_fileNameButton->setChecked(true);
     }
 
-    text.replace(wordStart, wordEnd - wordStart + 1, replace);
-    q->setText(text);
-    q->setCursorPosition(wordStart + replace.length());
+    m_facetsWidget->setVisible(SearchSettings::showFacetsWidget());
 }
 
-DolphinSearchBox::DolphinSearchBox(QWidget* parent) :
-    QWidget(parent),
-    m_searchInput(0),
-    m_searchButton(0),
-    m_completer(0)
+void DolphinSearchBox::saveSettings()
+{
+    SearchSettings::setLocation(m_fromHereButton->isChecked() ? "FromHere" : "Everywhere");
+    SearchSettings::setWhat(m_fileNameButton->isChecked() ? "FileName" : "Content");
+    SearchSettings::setShowFacetsWidget(m_facetsToggleButton->isChecked());
+    SearchSettings::self()->writeConfig();
+}
+
+void DolphinSearchBox::init()
 {
-    QHBoxLayout* hLayout = new QHBoxLayout(this);
-    hLayout->setMargin(0);
-    hLayout->setSpacing(0);
+    // Create close button
+    QToolButton* closeButton = new QToolButton(this);
+    closeButton->setAutoRaise(true);
+    closeButton->setIcon(KIcon("dialog-close"));
+    closeButton->setToolTip(i18nc("@info:tooltip", "Quit searching"));
+    connect(closeButton, SIGNAL(clicked()), this, SLOT(emitCloseRequest()));
+
+    // Create search label
+    m_searchLabel = new QLabel(this);
 
+    // Create search box
     m_searchInput = new KLineEdit(this);
     m_searchInput->setClearButtonShown(true);
-    m_searchInput->setMinimumWidth(150);
-    m_searchInput->setClickMessage(i18nc("@label:textbox", "Search..."));
-    m_searchInput->installEventFilter(this);
-    hLayout->addWidget(m_searchInput);
-    connect(m_searchInput, SIGNAL(returnPressed()),
-            this, SLOT(emitSearchSignal()));
-
-    m_searchButton = new QToolButton(this);
-    m_searchButton->setAutoRaise(true);
-    m_searchButton->setIcon(KIcon("edit-find"));
-    m_searchButton->setToolTip(i18nc("@info:tooltip", "Click to begin the search"));
-    hLayout->addWidget(m_searchButton);
-    connect(m_searchButton, SIGNAL(clicked()),
-            this, SLOT(emitSearchSignal()));
+    m_searchInput->setFont(KGlobalSettings::generalFont());
+    setFocusProxy(m_searchInput);
+    connect(m_searchInput, SIGNAL(returnPressed(QString)),
+            this, SLOT(slotReturnPressed(QString)));
+    connect(m_searchInput, SIGNAL(textChanged(QString)),
+            this, SLOT(slotSearchTextChanged(QString)));
+
+    // Apply layout for the search input
+    QHBoxLayout* searchInputLayout = new QHBoxLayout();
+    searchInputLayout->setMargin(0);
+    searchInputLayout->addWidget(closeButton);
+    searchInputLayout->addWidget(m_searchLabel);
+    searchInputLayout->addWidget(m_searchInput);
+
+    // Create "Filename" and "Content" button
+    m_fileNameButton = new QToolButton(this);
+    m_fileNameButton->setText(i18nc("action:button", "Filename"));
+    initButton(m_fileNameButton);
+
+    m_contentButton = new QToolButton();
+    m_contentButton->setText(i18nc("action:button", "Content"));
+    initButton(m_contentButton);
+
+    QButtonGroup* searchWhatGroup = new QButtonGroup(this);
+    searchWhatGroup->addButton(m_fileNameButton);
+    searchWhatGroup->addButton(m_contentButton);
+
+    m_separator = new KSeparator(Qt::Vertical, this);
+
+    // Create "From Here" and "Everywhere"button
+    m_fromHereButton = new QToolButton(this);
+    m_fromHereButton->setText(i18nc("action:button", "From Here"));
+    initButton(m_fromHereButton);
+
+    m_everywhereButton = new QToolButton(this);
+    m_everywhereButton->setText(i18nc("action:button", "Everywhere"));
+    initButton(m_everywhereButton);
+
+    QButtonGroup* searchLocationGroup = new QButtonGroup(this);
+    searchLocationGroup->addButton(m_fromHereButton);
+    searchLocationGroup->addButton(m_everywhereButton);
+
+    // Create "Facets" widgets
+    m_facetsToggleButton = new QToolButton(this);
+    m_facetsToggleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    initButton(m_facetsToggleButton);
+    connect(m_facetsToggleButton, SIGNAL(clicked()), this, SLOT(slotFacetsButtonToggled()));
+
+    m_facetsWidget = new DolphinFacetsWidget(this);
+    m_facetsWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+    connect(m_facetsWidget, SIGNAL(facetChanged()), this, SLOT(slotFacetChanged()));
+
+    // Apply layout for the options
+    QHBoxLayout* optionsLayout = new QHBoxLayout();
+    optionsLayout->setMargin(0);
+    optionsLayout->addWidget(m_fileNameButton);
+    optionsLayout->addWidget(m_contentButton);
+    optionsLayout->addWidget(m_separator);
+    optionsLayout->addWidget(m_fromHereButton);
+    optionsLayout->addWidget(m_everywhereButton);
+    optionsLayout->addStretch(1);
+    optionsLayout->addWidget(m_facetsToggleButton);
+
+    // Put the options into a QScrollArea. This prevents increasing the view width
+    // in case that not enough width for the options is available.
+    QWidget* optionsContainer = new QWidget(this);
+    optionsContainer->setLayout(optionsLayout);
+
+    m_optionsScrollArea = new QScrollArea(this);
+    m_optionsScrollArea->setFrameShape(QFrame::NoFrame);
+    m_optionsScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    m_optionsScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    m_optionsScrollArea->setMaximumHeight(optionsContainer->sizeHint().height());
+    m_optionsScrollArea->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    m_optionsScrollArea->setWidget(optionsContainer);
+    m_optionsScrollArea->setWidgetResizable(true);
+
+    m_topLayout = new QVBoxLayout(this);
+    m_topLayout->setMargin(0);
+    m_topLayout->addLayout(searchInputLayout);
+    m_topLayout->addWidget(m_optionsScrollArea);
+    m_topLayout->addWidget(m_facetsWidget);
+
+    loadSettings();
+
+    // The searching should be started automatically after the user did not change
+    // the text within one second
+    m_startSearchTimer = new QTimer(this);
+    m_startSearchTimer->setSingleShot(true);
+    m_startSearchTimer->setInterval(1000);
+    connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchRequest()));
+
+    updateFacetsToggleButton();
+    applyReadOnlyState();
 }
 
-DolphinSearchBox::~DolphinSearchBox()
+KUrl DolphinSearchBox::nepomukUrlForSearching() const
 {
-}
+#ifdef HAVE_NEPOMUK
+    // Create the term for the text from the input-field
+    // dependent on whether a searching for content or
+    // filename is done
+    const QString text = m_searchInput->text();
+    Nepomuk2::Query::Term searchLabelTerm;
+    if (m_contentButton->isChecked()) {
+        // Let Nepomuk parse the query
+        searchLabelTerm = Nepomuk2::Query::QueryParser::parseQuery(text, Nepomuk2::Query::QueryParser::DetectFilenamePattern).term();
+    } else {
+        // Search the text in the filename only
+        QString regex = QRegExp::escape(text);
+        regex.replace("\\*", QLatin1String(".*"));
+        regex.replace("\\?", QLatin1String("."));
+        regex.replace("\\", "\\\\");
+        searchLabelTerm = Nepomuk2::Query::ComparisonTerm(
+                                Nepomuk2::Vocabulary::NFO::fileName(),
+                                Nepomuk2::Query::LiteralTerm(regex),
+                                Nepomuk2::Query::ComparisonTerm::Regexp);
+    }
 
-bool DolphinSearchBox::event(QEvent* event)
-{
-    if (event->type() == QEvent::Polish) {
-        m_searchInput->setFont(KGlobalSettings::generalFont());
-    } else if (event->type() == QEvent::KeyPress) {
-        if (static_cast<QKeyEvent *>(event)->key() == Qt::Key_Escape) {
-            m_searchInput->clear();
-        }
+    // Get the term from the facets and merge it with the
+    // created term from the input-field.
+    Nepomuk2::Query::Term facetsTerm = m_facetsWidget->facetsTerm();
+
+    Nepomuk2::Query::FileQuery fileQuery;
+    fileQuery.setFileMode(Nepomuk2::Query::FileQuery::QueryFilesAndFolders);
+    if (facetsTerm.isValid()) {
+        Nepomuk2::Query::AndTerm andTerm;
+        andTerm.addSubTerm(searchLabelTerm);
+        andTerm.addSubTerm(facetsTerm);
+        fileQuery.setTerm(andTerm);
+    } else {
+        fileQuery.setTerm(searchLabelTerm);
     }
-    return QWidget::event(event);
+
+    if (m_fromHereButton->isChecked()) {
+        const bool recursive = true;
+        fileQuery.addIncludeFolder(m_searchPath, recursive);
+    }
+
+    return fileQuery.toSearchUrl(i18nc("@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.",
+                                       "Query Results from '%1'",
+                                       text));
+#else
+    return KUrl();
+#endif
 }
 
-#include <kdebug.h>
-bool DolphinSearchBox::eventFilter(QObject* watched, QEvent* event)
+void DolphinSearchBox::applyReadOnlyState()
 {
-    if ((watched == m_searchInput) && (event->type() == QEvent::FocusIn)) {
-        // Postpone the creation of the search completer until
-        // the search box is used. This decreases the startup time
-        // of Dolphin.
-        if (m_completer == 0) {
-            m_completer = new DolphinSearchCompleter(m_searchInput);
-        }
-        kDebug() << "---- got focus! is visible? " << isVisible();
-        emit requestSearchOptions();
+#ifdef HAVE_NEPOMUK
+    if (m_readOnly) {
+        m_searchLabel->setText(Nepomuk2::Query::Query::titleFromQueryUrl(m_readOnlyQuery));
+    } else {
+#else
+    {
+#endif
+        m_searchLabel->setText(i18nc("@label:textbox", "Find:"));
     }
 
-    return QWidget::eventFilter(watched, event);
-}
+    m_searchInput->setVisible(!m_readOnly);
+    m_optionsScrollArea->setVisible(!m_readOnly);
 
+    if (m_readOnly) {
+        m_facetsWidget->hide();
+    } else {
+        m_facetsWidget->setVisible(SearchSettings::showFacetsWidget());
+    }
+}
 
-void DolphinSearchBox::emitSearchSignal()
+void DolphinSearchBox::updateFacetsToggleButton()
 {
-    emit search(KUrl("nepomuksearch:/" + m_searchInput->text()));
+    const bool facetsIsVisible = SearchSettings::showFacetsWidget();
+    m_facetsToggleButton->setChecked(facetsIsVisible ? true : false);
+    m_facetsToggleButton->setIcon(KIcon(facetsIsVisible ? "arrow-up-double" : "arrow-down-double"));
+    m_facetsToggleButton->setText(facetsIsVisible ? i18nc("action:button", "Less Options") : i18nc("action:button", "More Options"));
 }
 
 #include "dolphinsearchbox.moc"