All pastes #755905 Raw Edit

Unnamed

public text v1 · immutable
#755905 ·published 2007-10-31 00:02 UTC
rendered paste body
/*
 *   Copyright 2006-2007 Aaron Seigo <aseigo@kde.org>
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Library General Public License as
 *   published by the Free Software Foundation; either version 2, 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 Library 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.
 */

#ifndef RUNNER_H
#define RUNNER_H

#include <QtCore/QObject>
#include <QtCore/QList>

#include <plasma/plasma_export.h>

class KActionCollection;
class QAction;

namespace Plasma
{


class Search : public QObject
{
    Q_OBJECT

    public:
        Search(const QString &term);
        ~Search();

        QString term();
        bool isUrl();
        SearchType searchType();
        QString mimetype();

        SearchAction* addInformationalMatch(AbstractRunner *runner);
        SearchAction* addExactMatch(AbstractRunner *runner);
        SearchAction* addPossibleMatch(AbstractRunner *runner);

        QList<SearchAction *> informationalMatches();
        QList<SearchAction *> exactMatches();
        QList<SearchAction *> possibleMatches();

    private:
        class Private;
        Private * const d;
};

class SearchAction : public QAction
{
    public:
        enum Type { Informational, Exact, Possible }

        Action(Search *search, AbstractRunner *runner);

        /**
         * The search term that triggered this action
         */
        QString term();

        /**
         * Sets the relevance of this action for the search
         * it was created for.
         *
         * @param relevance a number between 0 and 1.
         */
        void setRelevance(qreal relevance);

        /**
         * The relevance of this action to the search. By default,
         * the relevance is 1.
         *
         * @return a number between 0 and 1
         */
        qreal relevance();

    private:
        class Private;
        Private * const d;
}

/**
 * A abstract super-class for Plasma Runners
 */
class PLASMA_EXPORT AbstractRunner : public QObject
{
    Q_OBJECT

    public:
        typedef QList<AbstractRunner*> List;

        /**
         * Static method is called to load and get a list available of Runners.
         */
        static List loadRunners(QWidget* parent);

        /**
         * Constrcuts an Runner object. Since AbstractRunner has pure virtuals,
         * this constructor can not be called directly. Rather a subclass must
         * be created
         */
        explicit AbstractRunner(QObject* parent = 0);
        virtual ~AbstractRunner();

        /**
         * If the runner can run precisely this term, return a QAction, else
         * return 0. The first runner that returns a QAction will be the
         * default runner. Other runner's actions will be suggested in the
         * interface. Non-exact matches should be offered via findMatches.
         * The action will be activated if the user selects it.
         * If the action is informational only and should not be executed,
         * disable the action with setEnabled( false ).
         *
         * If this runner's exact match is selected, the action will not
         * be triggered, but it will be passed into the exec method.
         * @see exec
         *
         * Ownership of the action passes to the AbstractRunner class.
         */
        virtual void match(Search& search) = 0;

        /**
         * If the runner has options that the user can interact with to modify
         * what happens when exec or one of the actions created in fillMatches
         * is called, the runner should return true
         */
        virtual bool hasOptions();

        /**
         * If the hasOptions() returns true, this method will be called to get
         * the widget displaying the options the user can interact with.
         */
        virtual QWidget* options();

    protected:
        virtual void exec(const SearchAction *action);

    private:
        class Private;
        Private* const d;

    private Q_SLOTS:
        void runExactMatch();
};

} // Plasma namespace

#define K_EXPORT_PLASMA_RUNNER( libname, classname )     \
K_PLUGIN_FACTORY(factory, registerPlugin<classname>();) \
K_EXPORT_PLUGIN(factory("plasma_runner_" #libname))

#endif