/**********************************************************************
** Copyright (C) 2000-2001 Trolltech AS.  All rights reserved.
**
** This file is part of TQt Designer.
**
** 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 valid TQt Enterprise Edition or TQt Professional Edition
** licenses may use this file in accordance with the TQt Commercial 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/gpl/ for GPL licensing information.
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
**   information about TQt Commercial License Agreements.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/

#ifndef DESIGNERAPPIFACE_H
#define DESIGNERAPPIFACE_H

#include "../interfaces/designerinterface.h"
#include "project.h"

class FormWindow;
class MainWindow;
class Project;
class OutputWindow;
class SourceFile;

class DesignerInterfaceImpl : public DesignerInterface
{
public:
    DesignerInterfaceImpl( MainWindow *mw );

    DesignerProject *currentProject() const;
    DesignerFormWindow *currentForm() const;
    DesignerSourceFile *currentSourceFile() const;
    TQPtrList<DesignerProject> projectList() const;
    void showStatusMessage( const TQString &, int ms = 0 ) const;
    DesignerDock *createDock() const;
    DesignerOutputDock *outputDock() const;
    void setModified( bool b, TQWidget *window );
    void updateFunctionList();

    void onProjectChange( TQObject *receiver, const char *slot );
    void onFormChange( TQObject *receiver, const char *slot );

    bool singleProjectMode() const;
    void showError( TQWidget *widget, int line, const TQString &message );
    void runFinished();
    void showStackFrame( TQWidget *w, int line );
    void showDebugStep( TQWidget *w, int line );
    void runProjectPrecondition();
    void runProjectPostcondition( TQObjectList *l );


    TQRESULT queryInterface( const TQUuid &uuid, TQUnknownInterface** iface );
    TQ_REFCOUNT

private:
    MainWindow *mainWindow;

};

class DesignerProjectImpl: public DesignerProject
{
public:
    DesignerProjectImpl( Project *pr );

    TQPtrList<DesignerFormWindow> formList() const;
    TQStringList formNames() const;
    TQString formFileName( const TQString &form ) const;
    void addForm( DesignerFormWindow * );
    void removeForm( DesignerFormWindow * );
    TQString fileName() const;
    void setFileName( const TQString & );
    TQString projectName() const;
    void setProjectName( const TQString & );
    TQString databaseFile() const;
    void setDatabaseFile( const TQString & );
    void setupDatabases() const;
    TQPtrList<DesignerDatabase> databaseConnections() const;
    void addDatabase( DesignerDatabase * );
    void removeDatabase( DesignerDatabase * );
    void save() const;
    void setLanguage( const TQString & );
    TQString language() const;
    void setCustomSetting( const TQString &key, const TQString &value );
    TQString customSetting( const TQString &key ) const;
    DesignerPixmapCollection *pixmapCollection() const;
    void breakPoints( TQMap<TQString, TQValueList<uint> > &bps ) const;
    TQString breakPointCondition( TQObject *o, int line ) const;
    void setBreakPointCondition( TQObject *o, int line, const TQString &condition );
    void clearAllBreakpoints() const;
    void setIncludePath( const TQString &platform, const TQString &path );
    void setLibs( const TQString &platform, const TQString &path );
    void setDefines( const TQString &platform, const TQString &path );
    void setConfig( const TQString &platform, const TQString &config );
    void setTemplate( const TQString &t );
    TQString config( const TQString &platform ) const;
    TQString libs( const TQString &platform ) const;
    TQString defines( const TQString &platform ) const;
    TQString includePath( const TQString &platform ) const;
    TQString templte() const;
    bool isGenericObject( TQObject *o ) const;

private:
    Project *project;

};

#ifndef TQT_NO_SQL
class TQSqlDatabase;

class DesignerDatabaseImpl: public DesignerDatabase
{
public:
    DesignerDatabaseImpl( DatabaseConnection *d );

    TQString name() const;
    void setName( const TQString & );
    TQString driver() const;
    void setDriver( const TQString & );
    TQString database() const;
    void setDatabase( const TQString & );
    TQString userName() const;
    void setUserName( const TQString & );
    TQString password() const;
    void setPassword( const TQString & );
    TQString hostName() const;
    void setHostName( const TQString & );
    TQStringList tables() const;
    void setTables( const TQStringList & );
    TQMap<TQString, TQStringList> fields() const;
    void setFields( const TQMap<TQString, TQStringList> & );
    void open( bool suppressDialog = TRUE ) const;
    void close() const;
    TQSqlDatabase* connection();
private:
    DatabaseConnection *db;

};
#endif

class DesignerPixmapCollectionImpl : public DesignerPixmapCollection
{
public:
    DesignerPixmapCollectionImpl( PixmapCollection *coll );
    void addPixmap( const TQPixmap &p, const TQString &name, bool force );
    TQPixmap pixmap( const TQString &name ) const;

private:
    PixmapCollection *pixCollection;

};

class DesignerFormWindowImpl: public DesignerFormWindow
{
public:
    DesignerFormWindowImpl( FormWindow *fw );

    TQString name() const;
    void setName( const TQString &n );
    TQString fileName() const;
    void setFileName( const TQString & );
    void save() const;
    bool isModified() const;
    void insertWidget( TQWidget * );
    TQWidget *create( const char *className, TQWidget *parent, const char *name );
    void removeWidget( TQWidget * );
    TQWidgetList widgets() const;
    void undo();
    void redo();
    void cut();
    void copy();
    void paste();
    void adjustSize();
    void editConnections();
    void checkAccels();
    void layoutH();
    void layoutV();
    void layoutHSplit();
    void layoutVSplit();
    void layoutG();
    void layoutHContainer( TQWidget* w );
    void layoutVContainer( TQWidget* w );
    void layoutGContainer( TQWidget* w );
    void breakLayout();
    void selectWidget( TQWidget * );
    void selectAll();
    void clearSelection();
    bool isWidgetSelected( TQWidget * ) const;
    TQWidgetList selectedWidgets() const;
    TQWidget *currentWidget() const;
    TQWidget *form() const;
    void setCurrentWidget( TQWidget * );
    TQPtrList<TQAction> actionList() const;
    TQAction *createAction( const TQString& text, const TQIconSet& icon, const TQString& menuText, int accel,
			   TQObject* parent, const char* name = 0, bool toggle = FALSE );
    void addAction( TQAction * );
    void removeAction( TQAction * );
    void preview() const;
    void addFunction( const TQCString &function, const TQString& specifier, const TQString &access,
		      const TQString &type, const TQString &language, const TQString &returnType );
    void addConnection( TQObject *sender, const char *signal, TQObject *receiver, const char *slot );
    void setProperty( TQObject *o, const char *property, const TQVariant &value );
    TQVariant property( TQObject *o, const char *property ) const;
    void setPropertyChanged( TQObject *o, const char *property, bool changed );
    bool isPropertyChanged( TQObject *o, const char *property ) const;
    void setColumnFields( TQObject *o, const TQMap<TQString, TQString> & );
    TQStringList implementationIncludes() const;
    TQStringList declarationIncludes() const;
    void setImplementationIncludes( const TQStringList &lst );
    void setDeclarationIncludes( const TQStringList &lst );
    TQStringList forwardDeclarations() const;
    void setForwardDeclarations( const TQStringList &lst );
    TQStringList signalList() const;
    void setSignalList( const TQStringList &lst );
    void addMenu( const TQString &text, const TQString &name );
    void addMenuAction( const TQString &menu, TQAction *a );
    void addMenuSeparator( const TQString &menu );
    void addToolBar( const TQString &text, const TQString &name );
    void addToolBarAction( const TQString &tb, TQAction *a );
    void addToolBarSeparator( const TQString &tb );

    void onModificationChange( TQObject *receiver, const char *slot );

private:
    FormWindow *formWindow;

};

class DesignerDockImpl: public DesignerDock
{
public:
    DesignerDockImpl();

    TQDockWindow *dockWindow() const;
};

class DesignerOutputDockImpl: public DesignerOutputDock
{
public:
    DesignerOutputDockImpl( OutputWindow *ow );

    TQWidget *addView( const TQString &pageName );
    void appendDebug( const TQString & );
    void clearDebug();
    void appendError( const TQString &, int );
    void clearError();

private:
    OutputWindow *outWin;

};

class DesignerSourceFileImpl : public DesignerSourceFile
{
public:
    DesignerSourceFileImpl( SourceFile *e );
    TQString fileName() const;

private:
    SourceFile *ed;

};

#endif