/* This file is part of the KDE project
   Copyright (C) 2004 Alexander Dymo <adymo@kdevelop.org>

   This library 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 of the License, or (at your option) any later version.

   This library 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/
#ifndef KDEVPLUGINCONTROLLER_H
#define KDEVPLUGINCONTROLLER_H

#include <tqobject.h>

#include <kurl.h>
#include <ktrader.h>

/**
@file kdevplugincontroller.h
TDevelop plugin controller interface.
*/

class KDevPlugin;
class ProfileEngine;

/**
The base class for TDevelop plugin controller.
Plugin controller is responsible for quering, loading and unloading available plugins.
*/
class KDevPluginController: public TQObject
{
    Q_OBJECT
  
public:

    /**
     * Returns a uniquely specified plugin. If it isn't already loaded, it will be.
     * Use with caution! See extension for parameter details.
     */
    virtual KDevPlugin * loadPlugin( const TQString & serviceType, const TQString & constraint ) = 0;

    /**
     * Unloads the plugin specified by @p plugin
     * @param plugin The plugin desktopEntryName of the plugin to unload
     */
    virtual void unloadPlugin( const TQString & plugin ) = 0;

    /**Unloads plugins specified by @p list.
    @param list The list of plugin names to unload. plugin name corresponds
    to the "Name" property in plugin .desktop file.*/
    virtual void unloadPlugins(TQStringList const &list) = 0;

    /**@return The list of currently loaded plugins.*/
    virtual const TQValueList<KDevPlugin*> loadedPlugins() = 0;

    /**Queries for the plugin which supports given service type.
    All already loaded plugins will be queried and the first one to support the service type
    will be returned. Any plugin can be an extension, only "X-TDE-ServiceTypes=..." entry is
    required in .desktop file for that plugin.
    @param serviceType The service type of an extension (like "TDevelop/SourceFormatter")
    @param constraint The constraint which is applied when quering for the service. This
    constraint is a usual TDETrader constraint statement (like "[X-TDevelop-Foo]=='MyFoo'").
    @return A KDevelop extension plugin for given service type or 0 if no plugin supports it*/
    virtual KDevPlugin *extension(const TQString &serviceType, const TQString &constraint = "") = 0;

    /**Queries KDevelop services. Version is checked automatically
    by adding proper X-TDevelop-Version=N statement into the query.
    @param serviceType The service type to query, for example "TDevelop/Plugin" or
    "TDevelop/SourceFormatter."
    @param constraint A constraint for the service. Do not include plugin version number - it
    is done automatically.
    @return The list of plugin offers.*/
    static TDETrader::OfferList query(const TQString &serviceType, const TQString &constraint);

    /**Queries TDevelop plugins. Works like
    KDevPluginController::query with serviceType set to "TDevelop/Plugin".
    @param constraint A constraint for the service. Do not include plugin version number - it
    is done automatically.
    @return The list of plugin offers.*/
    static TDETrader::OfferList queryPlugins(const TQString &constraint);

    /**Reimplement this function only if your shell supports plugin profiles.
    @return The list of URLs to the profile resources (files) with given @p extension.
    @param nameFilter Name filter for files. @see TQDir::setNameFilter documentation
    for name filters syntax.*/
    virtual KURL::List profileResources(const TQString &nameFilter);

    /**Reimplement this function only if your shell supports plugin profiles.
    @return The list of URLs to the resources (files) with given @p extension.
    This list is obtained by a recursive search that process given profile
    and all it's subprofiles.
    @param nameFilter Name filter for files. @see TQDir::setNameFilter documentation
    for name filters syntax.*/
    virtual KURL::List profileResourcesRecursive(const TQString &nameFilter);

    /** @return The current Profile Engine  */
    virtual ProfileEngine &engine() = 0;

signals:
    /**Emitted when a plugin profile was changed (reloaded, other profile opened, etc.).
    Should work only on shells with plugin profiles support.*/
    void profileChanged();

protected:
    /**Constructor.*/
    KDevPluginController();

};

#endif
