
/***************************************************************************
*   Copyright (C) 2006 by Andreas Pakulat                                 *
*   apaku@gmx.de                                                          *
*                                                                         *
*   Part of this file is taken from TQt Designer.                          *
*                                                                         *
*   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.                                   *
*                                                                         *
***************************************************************************/

#include "qmakescopeitem.h"

#include <tqdir.h>
#include <tqregexp.h>

#include <kiconloader.h>
#include <tdelocale.h>
#include <kdebug.h>
#include <kdirwatch.h>

#include "scope.h"
#include "urlutil.h"
#include "trollprojectwidget.h"
/*
 * Class qProjectItem
 */

qProjectItem::qProjectItem( Type type, TQListView *parent, const TQString &text )
        : TQListViewItem( parent, text ), typ( type )
{}


qProjectItem::qProjectItem( Type type, qProjectItem *parent, const TQString &text )
        : TQListViewItem( parent, text ), typ( type )
{}



/*
 * Class GroupItem
 */

GroupItem::GroupItem( TQListView *lv, GroupType type, const TQString &text, QMakeScopeItem* spitem )
        : qProjectItem( Group, lv, text )
{
    this->owner = spitem;
    groupType = type;
//     files.setAutoDelete( true );
    setPixmap( 0, SmallIcon( "application-x-tar" ) );
}

GroupItem::GroupType GroupItem::groupTypeForExtension( const TQString &ext )
{
    if ( ext == "cpp" || ext == "cc" || ext == "c" || ext == "C" || ext == "c++" || ext == "cxx" || ext == "ocl" )
        return Sources;
    else if ( ext == "hpp" || ext == "h" || ext == "hxx" || ext == "hh" || ext == "h++" || ext == "H" )
        return Headers;
    else if ( ext == "ui" )
        return Forms;
    else if ( ext == "jpg" || ext == "jpeg" || ext == "png" || ext == "xpm" || ext == "gif" || ext == "bmp" )
        return Images;
    else if ( ext == "idl" )
        return IDLs;
    else if ( ext == "l" || ext == "ll" || ext == "lxx" || ext == "l++" )
        return Lexsources;
    else if ( ext == "y" || ext == "yy" || ext == "yxx" || ext == "y++" )
        return Yaccsources;
    else if ( ext == "ts" )
        return Translations;
    else if ( ext == "qrc" )
        return Resources;
    else
        return Distfiles;
}

void GroupItem::groupTypeMeanings( GroupItem::GroupType type, TQString& title, TQString& ext )
{
    switch ( type )
    {
        case GroupItem::Sources:
            title = i18n( "Sources" );
            ext = "*.cpp *.c";
            break;
        case GroupItem::Headers:
            title = i18n( "Headers" );
            ext = "*.h *.hpp";
            break;
        case GroupItem::Forms:
            title = i18n( "Forms" );
            ext = "*.ui";
            break;
        case GroupItem::IDLs:
            title = i18n( "Corba IDLs" );
            ext = "*.idl *.kidl";
            break;
        case GroupItem::Lexsources:
            title = i18n( "Lexsources" );
            ext = "*.l *.ll *.lxx *.l++";
            break;
        case GroupItem::Yaccsources:
            title = i18n( "Yaccsources" );
            ext = "*.y *.yy *.yxx *.y++";
            break;
        case GroupItem::Images:
            title = i18n( "Images" );
            ext = "*.jpg *.jpeg *.png *.xpm *.gif *.bmp";
            break;
        case GroupItem::Resources:
            title = i18n( "Resources" );
            ext = "*.qrc";
            break;
        case GroupItem::Distfiles:
            title = i18n( "Distfiles" );
            ext = "*";
            break;
        case GroupItem::Translations:
            title = i18n( "Translations" );
            ext = "*.ts";
            break;
        case GroupItem::InstallRoot:
            title = i18n( "Installs" );
            ext = "*";
            break;
        case GroupItem::InstallObject:
            title = i18n( "Install object" );
            ext = "*";
            break;

        default:        // just give back source files, et all
            title = i18n( "Source Files" );
            ext = "*.cpp *.cc *.ocl *.c *.hpp *.h *.ui";
    }
}

void GroupItem::paintCell( TQPainter* p, const TQColorGroup& c, int column, int width, int align )
{
    TQColorGroup cg( c );
    if ( !firstChild() )
    {
        cg.setColor( TQColorGroup::Text, cg.mid() );
    }

    qProjectItem::paintCell( p, cg, column, width, align );
}

void GroupItem::addFileToScope( const TQString& filename )
{
    TQString file = filename;

    TQPtrListIterator<FileItem> it( files );
    while ( it.current() != 0 )
    {
        if ( it.current() ->text( 0 ) == file )      //File already exists in this subproject
            return ;
        ++it;
    }

    FileItem *fitem = owner->createFileItem( file );

    fitem->uiFileLink = owner->m_widget->getUiFileLink( owner->relativePath() + TQString( TQChar( TQDir::separator() ) ), owner->scope->resolveVariables( filename ) );
    files.append( fitem );
    switch ( groupType )
    {
        case GroupItem::Sources:
            owner->addValue( "SOURCES", file );
            break;
        case GroupItem::Headers:
            owner->addValue( "HEADERS", file );
            break;
        case GroupItem::Forms:
        if( owner->m_widget->isTMakeProject() )
                owner->addValue( "INTERFACES", file );
            else
                owner->addValue( "FORMS", file );
            break;
        case GroupItem::IDLs:
            owner->addValue( "IDLS", file );
            break;
        case GroupItem::Lexsources:
            owner->addValue( "LEXSOURCES", file );
            break;
        case GroupItem::Yaccsources:
            owner->addValue( "YACCSOURCES", file );
            break;
        case GroupItem::Images:
            owner->addValue( "IMAGES", file );
            break;
        case GroupItem::Resources:
            owner->addValue( "RESOURCES", file );
            break;
        case GroupItem::Distfiles:
            owner->addValue( "DISTFILES", file );
            break;
        case GroupItem::Translations:
            owner->addValue( "TRANSLATIONS", file );
            break;
        case GroupItem::InstallObject:
            owner->addValue( text( 0 ) + ".files", file );
            break;
        default:
            break;
    }
    owner->scope->saveToFile();
}

void GroupItem::removeFileFromScope( const TQString& filename )
{
    TQString filePath;

    TQPtrListIterator<FileItem> it( files );
    while ( it.current() != 0 )
    {
        if ( it.current() ->text( 0 ) == filename )      //File already exists in this subproject
        {
            FileItem * fitem = it.current();
            filePath = fitem->localFilePath;
            files.remove( it );
            delete fitem;
            break;
        }
        ++it;
    }

    if ( groupType == GroupItem::Sources )
    {
        owner->removeValue( "SOURCES", filePath );
    }
    else if ( groupType == GroupItem::Headers )
    {
        owner->removeValue( "HEADERS", filePath );
    }
    else if ( groupType == GroupItem::Forms )
    {
        owner->removeValue( "FORMS", filePath );
    }
    else if ( groupType == GroupItem::Images )
    {
        owner->removeValue( "IMAGES", filePath );
    }
    else if ( groupType == GroupItem::Resources )
    {
        owner->removeValue( "RESOURCES", filePath );
    }
    else if ( groupType == GroupItem::Lexsources )
    {
        owner->removeValue( "LEXSOURCES", filePath );
    }
    else if ( groupType == GroupItem::Yaccsources )
    {
        owner->removeValue( "YACCSOURCES", filePath );
    }
    else if ( groupType == GroupItem::Translations )
    {
        owner->removeValue( "TRANSLATIONS", filePath );
    }
    else if ( groupType == GroupItem::IDLs )
    {
        owner->removeValue( "IDL", filePath );
    }
    else if ( groupType == GroupItem::Distfiles )
    {
        owner->removeValue( "DISTFILES", filePath );
    }
    else if ( groupType == GroupItem::InstallObject )
    {
        owner->removeValue( text( 0 ) + ".files", filePath );
    }
    owner->scope->saveToFile();
}

void GroupItem::addInstallObject( const TQString& objectname )
{
    GroupItem * objitem = owner->createGroupItem( GroupItem::InstallObject, objectname, owner );
    owner->addValue( "INSTALLS", objectname );
    owner->scope->saveToFile();
    installs.append( objitem );
}

void GroupItem::removeInstallObject( GroupItem* item )
{
    owner->removeValue( "INSTALLS", item->text(0) );
    owner->scope->saveToFile();
    installs.remove( item );
    delete item;
}

/*
 * Class FileItem
 */

FileItem::FileItem( TQListView *lv, const TQString &text )
        : qProjectItem( File, lv, text ), uiFileLink( "" )
{
    // if excluded is set the file is excluded in the subproject/project.
    // by default excluded is set to false, thus file is included
    //     excluded = exclude;
    setPixmap( 0, SmallIcon( "text-x-generic" ) );
}


/*
 * Class QMakeScopeItem
 */

QMakeScopeItem::QMakeScopeItem( TQListView *parent, const TQString &text, Scope* s, TrollProjectWidget* widget )
        : qProjectItem( Subproject, parent, text ), scope( s ), m_widget( widget )
{
    //   configuration.m_template = TQTMP_APPLICATION;
    init();
}


QMakeScopeItem::QMakeScopeItem( QMakeScopeItem *parent, const TQString &text, Scope* s )
        : qProjectItem( Subproject, parent, text ), scope( s ), m_widget( parent->m_widget )
{
    init();
}

QMakeScopeItem::~QMakeScopeItem()
{
    TQMap<GroupItem::GroupType, GroupItem*>::iterator it;
    for ( it = groups.begin() ; it != groups.end() ; ++it )
    {
        GroupItem* s = it.data();
        delete s;
    }
    groups.clear();

}

TQString QMakeScopeItem::relativePath()
{
    if( !scope || !scope->parent() )
        return "";
    if( scope->scopeType() == Scope::ProjectScope )
    {
        if( scope->parent() && scope->parent()->variableValues("SUBDIRS").contains( URLUtil::relativePathToFile( scope->parent()->projectDir(), scope->projectDir()+"/"+scope->fileName() ) ) )
        {
            return URLUtil::relativePathToFile( scope->parent()->projectDir(), scope->projectDir()+"/"+scope->fileName() );
        }else
        {
            return URLUtil::getRelativePath( m_widget->projectDirectory(), scope->projectDir() );
        }
    }else
        return static_cast<QMakeScopeItem*>( parent() ) ->relativePath();
//     if( !scope->parent() )
//         return "";
//     else if ( !scope->parent()->parent() || scope->scopeType() != Scope::ProjectScope )
//         return scope->scopeName();
//     else if ( scope->scopeType() == Scope::ProjectScope )
//         return ( static_cast<QMakeScopeItem*>( parent() ) ->relativePath()
//                  + TQString( TQChar( TQDir::separator() ) ) + scope->scopeName() );
//     else
//         return (  static_cast<QMakeScopeItem*>( parent() ) ->relativePath() );
}

TQString QMakeScopeItem::getSharedLibAddObject( TQString basePath )
{
    if ( scope->variableValues( "CONFIG" ).findIndex( "dll" ) != -1 )
    {
        TQString tmpPath = URLUtil::getRelativePath(basePath, scope->projectDir() );
        if ( !scope->variableValues( "DESTDIR" ).front().isEmpty() )
        {
            if ( TQDir::isRelativePath( scope->variableValues( "DESTDIR" ).front() ) )
                tmpPath += TQString( TQChar( TQDir::separator() ) ) + scope->variableValues( "DESTDIR" ).front();
            else
                tmpPath = scope->variableValues( "DESTDIR" ).front();
        }
        else
        {
            tmpPath += TQString( TQChar( TQDir::separator() ) );
        }

        tmpPath = TQDir::cleanDirPath( tmpPath );

        TQString libString;
        if ( !scope->variableValues( "TARGET" ).front().isEmpty() )
        {
            libString = tmpPath + TQString( TQChar( TQDir::separator() ) ) + "lib" + scope->variableValues( "TARGET" ).front() + ".so";

        }
        else
        {
            libString = tmpPath + TQString( TQChar( TQDir::separator() ) ) + "lib" + scope->projectName() + ".so";

        }
        return ( libString );
    }
    return "";
}

TQString QMakeScopeItem::getApplicationObject( TQString basePath )
{
    TQString tmpPath = URLUtil::getRelativePath(basePath, scope->projectDir() );
    TQString destdir = scope->resolveVariables( scope->variableValues( "DESTDIR" ).front() );

    if ( !destdir.isEmpty() )
    {
        if ( TQDir::isRelativePath( destdir ) )
            tmpPath += TQString( TQChar( TQDir::separator() ) ) + destdir;
        else
            tmpPath = destdir;
    }
    else
    {
        tmpPath += TQString( TQChar( TQDir::separator() ) );
    }

    tmpPath = TQDir::cleanDirPath( tmpPath );

    TQString target = scope->resolveVariables( scope->variableValues( "TARGET" ).front() );

    if ( target.isEmpty() )
        return tmpPath + TQString( TQChar( TQDir::separator() ) ) + scope->projectName();
    else
        return tmpPath + TQString( TQChar( TQDir::separator() ) ) + target;
}

TQString QMakeScopeItem::getLibAddObject( TQString basePath )
{
    if ( scope->variableValues( "CONFIG" ).findIndex( "dll" ) != -1 )
    {
        TQString target = scope->resolveVariables( scope->variableValues( "TARGET" ).front() );
        if ( !target.isEmpty() )
        {
            return ( "-l" + target );
        }
        else
        {
            return ( "-l" + scope->projectName() );
        }
    }
    else if ( scope->variableValues( "CONFIG" ).findIndex( "staticlib" ) != -1
            || scope->variableValues("TEMPLATE").findIndex("lib") != -1 )
    {
        TQString tmpPath = URLUtil::getRelativePath(basePath, scope->projectDir() );
        TQString destdir = scope->resolveVariables( scope->variableValues( "DESTDIR" ).front() );
        if ( !destdir.isEmpty() )
        {
            if ( TQDir::isRelativePath( destdir ) )
                tmpPath += TQString( TQChar( TQDir::separator() ) ) + destdir;
            else
                tmpPath = destdir;
        }
        else
        {
            tmpPath += TQString( TQChar( TQDir::separator() ) );
        }

        tmpPath = TQDir::cleanDirPath( tmpPath );

        TQString libString;
        TQString target = scope->resolveVariables( scope->variableValues( "TARGET" ).front() );
        if ( !target.isEmpty() )
        {
            libString = tmpPath + TQString( TQChar( TQDir::separator() ) ) + "lib" + target + ".a";

        }
        else
        {
            libString = tmpPath + TQString( TQChar( TQDir::separator() ) ) + "lib" + scope->projectName() + ".a";

        }
        return ( libString );
    }

    return ( "" );
}
TQString QMakeScopeItem::getLibAddPath( TQString basePath )
{

    //PATH only add if shared lib
    if ( scope->variableValues( "CONFIG" ).findIndex( "dll" ) == -1 ) return ( "" );

    TQString tmpPath = URLUtil::getRelativePath(basePath, scope->projectDir() );
    TQString destdir = scope->resolveVariables( scope->variableValues( "DESTDIR" ).front() );
    if ( !destdir.isEmpty() )
    {
        if ( TQDir::isRelativePath( destdir ) )
            tmpPath += TQString( TQChar( TQDir::separator() ) ) + destdir;
        else
            tmpPath = destdir;
    }
    else
    {
        tmpPath += TQString( TQChar( TQDir::separator() ) );
    }

    tmpPath = TQDir::cleanDirPath( tmpPath );

    return ( tmpPath );

}

TQString QMakeScopeItem::getIncAddPath( TQString basePath )
{
    TQString tmpPath = URLUtil::getRelativePath( basePath, scope->projectDir() );
    tmpPath = TQDir::cleanDirPath( tmpPath );

    return ( tmpPath );
}

void QMakeScopeItem::buildSubTree()
{
    TQValueList<Scope*>::const_iterator it;

    sortChildItems( 0, false );

    TQValueList<Scope*> scopes = scope->scopesInOrder();

    for ( it = scopes.begin(); it != scopes.end(); ++it )
    {
        if( (*it)->scopeType() != Scope::InvalidScope )
            new QMakeScopeItem( this, ( *it )->scopeName(), ( *it ) );
        else
            kdDebug( 9024 ) << "No QMakeScopeItem created" << endl;
    }
}


void QMakeScopeItem::init()
{
    if ( scope->scopeType() == Scope::SimpleScope )
    {
        setPixmap( 0, SmallIcon( "qmake_scope" ) );
    }
    else if ( scope->scopeType() == Scope::FunctionScope )
    {
        setPixmap( 0, SmallIcon( "qmake_func_scope" ) );
    }
    else if ( scope->scopeType() == Scope::IncludeScope )
    {
        setPixmap( 0, SmallIcon( "qmake_inc_scope" ) );
    }
    else
    {
        TQStringList tmp = scope->variableValues( "TEMPLATE" );
        if( scope->isEnabled() )
        {
            if ( tmp.findIndex( "subdirs" ) != -1 )
                setPixmap( 0, SmallIcon( "folder" ) );
            else if ( tmp.findIndex( "lib" ) != -1 )
                setPixmap( 0, SmallIcon( "qmake_lib" ) );
            else
                setPixmap( 0, SmallIcon( "qmake_app" ) );
        }else
        {
            if ( tmp.findIndex( "subdirs" ) != -1 )
                setPixmap( 0, SmallIcon( "folder_grey" ) );
            else if ( tmp.findIndex( "lib" ) != -1 )
                setPixmap( 0, SmallIcon( "qmake_lib_disabled" ) );
            else
                setPixmap( 0, SmallIcon( "qmake_app_disabled" ) );
        }
    }

    setEnabled( scope->isEnabled() );
    if( scope->isEnabled() )
    {
        buildGroups();
        buildSubTree();
    }
}

GroupItem* QMakeScopeItem::createGroupItem( GroupItem::GroupType type, const TQString& label, QMakeScopeItem* scopeitem )
{
    GroupItem * item = new GroupItem( scopeitem->listView(), type, label, scopeitem );
    scopeitem->listView() ->takeItem( item );
    return item;
}

FileItem* QMakeScopeItem::createFileItem( const TQString& name )
{
    TQString display = name;
    if( m_widget->showFilenamesOnly() )
    {
        int dirSepPos = name.findRev( TQChar( TQDir::separator() ) );
        if  ( dirSepPos != - 1 )
            display = name.mid( dirSepPos + 1 );
    }
    if( !m_widget->showVariablesInTree() )
    {
        display = scope->resolveVariables( display );
    }
    FileItem * fitem = new FileItem( listView(), display );
    listView() ->takeItem( fitem );

    fitem->localFilePath = name;

    return fitem;
}

void QMakeScopeItem::buildGroups()
{
    if( scope->variableValues("TEMPLATE").findIndex("subdirs") != -1 )
        return;
    TQStringList values;

    GroupItem* item;
    TQStringList::iterator it;

    values = scope->variableValues( "INSTALLS" );
    item = createGroupItem( GroupItem::InstallRoot, "INSTALLS", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        if ( ( *it ) == "target" )
            continue;

        TQString path = scope->variableValues( *it + ".path" ).front();
        GroupItem* installitem = createGroupItem( GroupItem::InstallObject, *it, this );
        item->installs.append( installitem );
        TQStringList files = scope -> variableValues( *it + ".files" );
        if ( !files.isEmpty() )
        {
            TQStringList::iterator filesit = files.begin();
            for ( ;filesit != files.end(); ++filesit )
            {
                installitem->files.append( createFileItem( *filesit ) );
            }
        }
    }

    values = scope->variableValues( "LEXSOURCES" );
    item = createGroupItem( GroupItem::Lexsources, "LEXSOURCES", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        item->files.append( createFileItem( *it ) );
    }

    values = scope->variableValues( "YACCSOURCES" );
    item = createGroupItem( GroupItem::Yaccsources, "YACCSOURCES", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        item->files.append( createFileItem( *it ) );
    }

    values = scope->variableValues( "DISTFILES" );
    item = createGroupItem( GroupItem::Distfiles, "DISTFILES", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        item->files.append( createFileItem( *it ) );
    }

    values = scope->variableValues( "IMAGES" );
    item = createGroupItem( GroupItem::Images, "IMAGES", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        item->files.append( createFileItem( *it ) );
    }

    values = scope->variableValues( "TRANSLATIONS" );
    item = createGroupItem( GroupItem::Translations, "TRANSLATIONS", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        item->files.append( createFileItem( *it ) );
    }

    values = scope->variableValues( "IDLS" );
    item = createGroupItem( GroupItem::IDLs, "Corba IDL", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        item->files.append( createFileItem( *it ) );
    }

    if ( m_widget->isTMakeProject() )
    {
        values = scope->variableValues( "INTERFACES" );
        item = createGroupItem( GroupItem::Forms, "INTERFACES", this );
    }
    else
    {
        values = scope->variableValues( "FORMS" );
        item = createGroupItem( GroupItem::Forms, "FORMS", this );
    }
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        item->files.append( createFileItem( *it ) );
    }

    values = scope->variableValues( "SOURCES" );
    item = createGroupItem( GroupItem::Sources, "SOURCES", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        FileItem* fitem = createFileItem( *it );
        fitem->uiFileLink = m_widget->getUiFileLink( relativePath() + TQString( TQChar( TQDir::separator() ) ), scope->resolveVariables( *it ) );
        item->files.append( fitem );
    }

    values = scope->variableValues( "HEADERS" );
    item = createGroupItem( GroupItem::Headers, "HEADERS", this );
    groups.insert( item->groupType, item );
    for ( it = values.begin(); it != values.end(); ++it )
    {
        FileItem* fitem = createFileItem( *it );
        fitem->uiFileLink = m_widget->getUiFileLink( relativePath() + TQString( TQChar( TQDir::separator() ) ), scope->resolveVariables( *it ) );
        item->files.append( fitem );
    }

}

void QMakeScopeItem::removeValues( const TQString& var, const TQStringList& values )
{
    for( TQStringList::const_iterator it = values.begin() ; it != values.end(); ++it )
    {
        removeValue( var, *it );
    }
}

void QMakeScopeItem::addValues( const TQString& var, const TQStringList& values )
{
    for( TQStringList::const_iterator it = values.begin() ; it != values.end(); ++it )
    {
        addValue( var, *it );
    }
}

void QMakeScopeItem::removeValue( const TQString& var, const TQString& value )
{
    if( scope->scopeType() != Scope::IncludeScope && scope->variableValues( var ).findIndex( value ) != -1 )
    {
        if( scope->variableValuesForOp( var, "+=" ).findIndex(value) != -1 )
        {
            scope->removeFromPlusOp( var, TQStringList( value ) );
            if( scope->variableValues( var ).findIndex( value ) != -1 )
            {
                scope->addToMinusOp( var, TQStringList( value ) );
            }
        }else
            scope->addToMinusOp( var, TQStringList( value ) );
    }else if( scope->scopeType() == Scope::IncludeScope )
    {
        scope->addToMinusOp( var, TQStringList( value ) );
    }
}

void QMakeScopeItem::addValue( const TQString& var, const TQString& value )
{
    if( scope->scopeType() != Scope::IncludeScope && scope->variableValues( var ).findIndex( value ) == -1 )
    {
        if( scope->variableValuesForOp( var, "-=" ).findIndex(value) != -1 )
            scope->removeFromMinusOp( var, TQStringList( value ) );
        else
            scope->addToPlusOp( var, TQStringList( value ) );
    }else if( scope->scopeType() == Scope::IncludeScope )
    {
        scope->addToPlusOp( var, TQStringList( value ) );
    }
}

void QMakeScopeItem::updateValues( const TQString& var, const TQStringList& values )
{
    TQStringList curValues = scope->variableValues( var, (scope->scopeType() != Scope::IncludeScope) );
    TQStringList scopeValues = scope->variableValuesForOp( var, "+=" );
    for( TQStringList::const_iterator it = curValues.begin(); it != curValues.end(); ++it )
    {
        if ( values.findIndex( *it ) == -1 )
        {
            if( scopeValues.findIndex( *it ) != -1 )
            {
                scope->removeFromPlusOp( var, TQStringList( *it ) );
                scopeValues.remove( *it );
            }else
                scope->addToMinusOp( var, TQStringList( *it ) );
        }
    }
    for( TQStringList::const_iterator it = values.begin(); it != values.end(); ++it )
    {
        if ( scopeValues.findIndex( *it ) != -1 )
        {
            scopeValues.remove(*it);
        }
    }
//     kdDebug(9024) << "--------------" << var << "------------------" << endl;
//     kdDebug(9024) << "values: " << values << "| scope:" << scopeValues << endl;
    scopeValues += values;
//     kdDebug(9024) << "values: " << values << "| scope:" << scopeValues << endl;
    scope->setPlusOp( var, scopeValues );
//     TQStringList tmp = scope->variableValuesForOp( var, "+=" );
//     kdDebug(9024) << "result:" << tmp << endl;
//     kdDebug(9024) << "---------------------------------------" << endl;
}

QMakeScopeItem* QMakeScopeItem::projectFileItem()
{
    if( scope->scopeType() != Scope::ProjectScope )
    {
        QMakeScopeItem* parentitem = dynamic_cast<QMakeScopeItem*>(parent());
        if( parentitem )
            return parentitem->projectFileItem();
    }
    return this;
}

void QMakeScopeItem::reloadProject()
{
    kdDebug(9024) << "Reloading Project" << endl;
    TQListViewItem* item = firstChild();
    while( item )
    {
        TQListViewItem* olditem = item;
        item = olditem->nextSibling();
        delete olditem;
    }
    TQMap<GroupItem::GroupType, GroupItem*>::iterator it;
    for ( it = groups.begin() ; it != groups.end() ; ++it )
    {
        GroupItem* s = it.data();
        TQListView* l = s->listView();
        if(l)
            l->removeItem(s);
        delete s;
    }
    groups.clear();
    scope->reloadProject();
    init();
}

void QMakeScopeItem::disableSubprojects( const TQStringList& dirs )
{
    TQStringList::const_iterator it = dirs.begin();
    for( ; it != dirs.end() ; ++it)
    {
        if( scope->variableValues("SUBDIRS").findIndex(*it) != -1 )
        {
            Scope* s = scope->disableSubproject(*it);
            if( !s )
                return;
            else
            {
                QMakeScopeItem* newitem = new QMakeScopeItem( this, s->scopeName(), s );
                TQListViewItem* lastitem = firstChild();
                while( lastitem && lastitem->nextSibling() )
                    lastitem = lastitem->nextSibling();
                if( lastitem )
                    newitem->moveItem(lastitem);
            }
        }
    }

}

int QMakeScopeItem::compare( TQListViewItem* i, int , bool ) const
{
    QMakeScopeItem* other = dynamic_cast<QMakeScopeItem*>(i);
    if( !i )
        return -1;
    if( other->scope->getNum() < scope->getNum() )
        return 1;
    else if ( other->scope->getNum() > scope->getNum() )
        return -1;
    else
        return 0;
}

TQMap<TQString, TQString> QMakeScopeItem::getLibInfos( TQString basePath )
{

    TQMap<TQString, TQString> result;
    if ( scope->variableValues( "TARGET" ).front().isEmpty() )
        result["shared_lib"] = "-l"+scope->projectName();
    else
        result["shared_lib"] = "-l"+scope->variableValues( "TARGET" ).front();

    TQString tmpPath = URLUtil::getRelativePath(basePath, scope->projectDir() );
    if ( !scope->variableValues( "DESTDIR" ).front().isEmpty() )
    {
        if ( TQDir::isRelativePath( scope->variableValues( "DESTDIR" ).front() ) )
            tmpPath += TQString( TQChar( TQDir::separator() ) ) + scope->variableValues( "DESTDIR" ).front();
        else
            tmpPath = scope->variableValues( "DESTDIR" ).front();
    }
    else
    {
        tmpPath += TQString( TQChar( TQDir::separator() ) );
    }

    tmpPath = TQDir::cleanDirPath( tmpPath );

    result["shared_libdir"] = "-L"+tmpPath;

    if ( scope->variableValues( "TARGET" ).front().isEmpty() )
        result["shared_depend"] = tmpPath+TQString(TQChar(TQDir::separator()))+"lib"+scope->projectName()+".so";
    else
        result["shared_depend"] = tmpPath+TQString(TQChar(TQDir::separator()))+"lib"+scope->variableValues( "TARGET" ).front()+".so";


    if ( scope->variableValues( "TARGET" ).front().isEmpty() )
        result["static_lib"] = tmpPath+TQString(TQChar(TQDir::separator()))+"lib"+scope->projectName()+".a";
    else
        result["static_lib"] = tmpPath+TQString(TQChar(TQDir::separator()))+"lib"+scope->variableValues( "TARGET" ).front()+".a";

    result["static_depend"] = result["static_lib"];

    if ( scope->variableValues( "TARGET" ).front().isEmpty() )
        result["app_depend"] = tmpPath + TQString( TQChar( TQDir::separator() ) ) + scope->projectName();
    else
        result["app_depend"] = tmpPath + TQString( TQChar( TQDir::separator() ) ) + scope->variableValues( "TARGET" ).front();

    TQString map;
    for( TQMap<TQString, TQString>::const_iterator it = result.begin(); it != result.end(); ++it )
        map += "["+it.key() + "=>" +it.data() + "],";
    kdDebug(9024) << "Running getLibInfo for" << scope->projectName() << "|" << map << endl;
    return result;
}
