/****************************************************************************
** $Id: quickide.cpp  beta1   edited Dec 10 13:07 $
**
** Copyright (C) 2001-2002 Trolltech AS.  All rights reserved.
**
** This file is part of the Qt Script for Applications framework (QSA).
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding a valid QSA Beta Evaluation Version license may use
** this file in accordance with the QSA Beta Evaluation Version License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
**   information about QSA Commercial License Agreements.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
*****************************************************************************/

#include "quickide.h"
#include "quickprograminterfaceimpl.h"
#include "quickprojectsettingsinterfaceimpl.h"
#include "quickeditorinterfaceimpl.h"
#include "quickpreferenceinterfaceimpl.h"
#include "quicklanguageinterfaceimpl.h"
#include "quickinterpreterinterfaceimpl.h"
#include "quickdebuggerfrontend.h"
#include "quickclassbrowserinterfaceimpl.h"

QuickDebuggerFrontend *QuickIdeInterfaceImpl::debugger = 0;

QuickIdeInterfaceImpl::QuickIdeInterfaceImpl()
{
    progIface = new QuickProgramInterfaceImpl;
    progIface->addRef();
    projIface = new QuickProjectSettingsInterfaceImpl;
    projIface->addRef();
    editorIface = new QuickEditorInterfaceImpl;
    editorIface->addRef();
    prefIface = new QuickPreferenceInterfaceImpl;
    prefIface->addRef();
    langIface = new QuickLanguageInterfaceImpl;
    langIface->addRef();
    interpIface = new QuickInterpreterInterfaceImpl;
    interpIface->addRef();
    if ( !debugger ) {
	debugger = new QuickDebuggerFrontend( editorIface );
	debugger->addRef();
    }
    cbIface = new QuickClassBrowserInterfaceImpl;
    cbIface->addRef();
}

QuickIdeInterfaceImpl::~QuickIdeInterfaceImpl()
{
    // This destructor is never ever called. See the comment below
    // addRef() for further details.
    progIface->release();
    projIface->release();
    editorIface->release();
    prefIface->release();
    langIface->release();
    interpIface->release();
    debugger->release();
    cbIface->release();
}

QRESULT QuickIdeInterfaceImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
{
    *iface = 0;
    if ( uuid == IID_QUnknown )
	*iface = (QUnknownInterface*)this;
    else if ( uuid == IID_QComponentInformation )
	*iface = (QComponentInformationInterface*)this;
    else if ( uuid == IID_Program )
	*iface = progIface;
    else if ( uuid == IID_ProjectSettings )
	*iface = projIface;
    else if ( uuid == IID_Editor )
	*iface = (EditorInterface*)new QuickEditorInterfaceImpl;
    else if ( uuid == IID_Preference )
	*iface = prefIface;
    else if ( uuid == IID_Language )
	*iface = langIface;
    else if ( uuid == IID_Interpreter )
	*iface = interpIface;
    else if ( uuid == IID_Action )
	*iface = debugger;
    else if ( uuid == IID_ClassBrowser )
	*iface = (ClassBrowserInterface*)cbIface;
    else
	return QE_NOINTERFACE;

    (*iface)->addRef();
    return QS_OK;
}

// We have to ensure that always the same instance of the
// QuickDebuggerFrontend is used. This is why debugger is a static
// member. But that also means, that if the plugin was loaded once we
// have to ensure, it doesn't get unloaded. That's why we don't really
// ref count, but always claim there is one reference to us.

unsigned long QuickIdeInterfaceImpl::addRef()
{
    return 1;
}

unsigned long QuickIdeInterfaceImpl::release()
{
    return 1;
}

Q_EXPORT_INTERFACE()
{
    Q_CREATE_INSTANCE( QuickIdeInterfaceImpl )
}

