/***************************************************************************
                          fileplugin.cpp  -  description
                             -------------------
    begin                : Mon Jul 1 2002
    copyright            : (C) 2002 by Dominik Seichter
    email                : domseichter@web.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 "fileplugin.h"

// TQt includes
#include <tqcheckbox.h>
#include <tqlabel.h>
#include <tqlayout.h>
#include <tqregexp.h>

// TDE includes
#include <tdeapplication.h>
#include <tdefilemetainfo.h>
#include <klineedit.h>
#include <tdelistbox.h>
#include <tdelocale.h>
#include <kiconloader.h>
#include <kpushbutton.h>

FilePlugin::FilePlugin( KService* service )
{
    if(!service) {
        setupKeys();
        return;
    }
        
    KFileMetaInfoProvider* mip = KFileMetaInfoProvider::self();
    m_name = service->name();
    m_comment = service->comment();
    TQStringList options = service->serviceTypes();
    for( unsigned int i = 0; i < options.count(); i++ ) {
        if( options[i] != "KFilePlugin" ) {
            m_mimetype = options[i];
            const KFileMimeTypeInfo* info = mip->mimeTypeInfo( m_mimetype );
            if( info )               
                keys = info->supportedKeys();

            fileplugin = mip->plugin( m_mimetype );
           
            KMimeType::Ptr mime = KMimeType::mimeType( m_mimetype );
            m_icon = mime->icon( TQString(), true );  // arguments are unused
            
            setPattern( mime );
        }
    }
}

FilePlugin::~FilePlugin()
{ }

void FilePlugin::setPattern( KMimeType::Ptr mime )
{
    TQStringList pattern = mime->patterns();
    if( pattern.count() ) {
        m_pattern = pattern[0];
        if( m_pattern.startsWith( "*." ) )
            m_pattern = m_pattern.right( m_pattern.length() - 2 );
    }
    
    // TODO: REFACTOR
    // We need a pattern
    if( m_pattern.isEmpty() ) {
        int a = 0;
        a = m_name.find( "-" );
        if( a > -1 )
            m_pattern = m_name.left( a ).lower();
        else {
            a = m_pattern.find( " " );
            if( a > -1 )
                m_pattern = m_name.left( a ).lower();
            else 
                m_pattern = m_name;
        }
    }
    
    setupKeys();
}

void FilePlugin::setupKeys()
{
    for( unsigned int i = 0; i < keys.count(); i++ ) 
        keys[i] = getPattern() + keys[i];
}

const TQString FilePlugin::getName() const
{
    return m_name;
}

const TQString FilePlugin::getAccelName() const
{
    return "&" + getName();
}

const TQString FilePlugin::getPattern() const
{
    return m_pattern;
}

const int FilePlugin::type() const
{
    return TYPE_BRACKET;
}

bool FilePlugin::checkError()
{
    return true;
}

void FilePlugin::drawInterface( TQWidget* w, TQVBoxLayout* l )
{
    TQSpacerItem* spacer = new TQSpacerItem( 20, 20, TQSizePolicy::Expanding, TQSizePolicy::Expanding );
    
    TQHBoxLayout* hbox = new TQHBoxLayout( 0, 6, 6 );
    
    TQLabel* pix = new TQLabel( w );
    pix->setPixmap( tdeApp->iconLoader()->loadIcon( m_icon, TDEIcon::Desktop ) );
    
    hbox->addWidget( pix );
    hbox->addWidget( new TQLabel( "<qt><b>"+getName()+"</b></qt>", w ) );
    hbox->addItem( spacer );

    l->addLayout( hbox );    
    l->addWidget( new TQLabel( m_comment, w ) );
    l->addWidget( new TQLabel( i18n("Supported tokens:"), w ) );

    TDEListBox* list = new TDEListBox( w );
    list->setColumnMode( TDEListBox::FitToWidth );

    for( unsigned int i = 0; i < keys.count(); i++ )
        list->insertItem( "[" + keys[i] + "]" );
    
    l->addWidget( list );
    l->setStretchFactor( list, 2 );
}

TQString FilePlugin::processFile( BatchRenamer* b, int i, TQString token, int )
{
    TQString filename = BatchRenamer::buildFilename( &b->files()[i].src );
    
    token = token.lower();

    /*
     * Check if we have something cached for this file
     */
    if( cache.contains( filename + "::" + token ) )
        return cache[filename + "::" + token ];

    for( unsigned int i = 0; i < keys.count(); i++ ) {
        if( token.lower() == keys[i].lower() ) {
            KFileMetaInfo meta( filename );
            if( meta.isValid() ) {
                TQString k = keys[i];
                if( k.startsWith( getPattern() ) )
                    k = k.mid( getPattern().length(), k.length() - getPattern().length() );
                    
                TQString ret = meta.item( k ).string( true ).stripWhiteSpace();

                if( cache.count() >= CACHE_MAX )
                    cache.remove( cache.begin() );

                cache.insert( filename + "::" + token, ret );
                tdeApp->processEvents();
                return ret;                    
            }
        }
    }
    
    return TQString();
}

void FilePlugin::addHelp( HelpDialogData* data )
{
    TQStringList list;
    for( unsigned int i = 0; i < keys.count(); i++ ) 
        list.append( "[" + keys[i] + "]" + ";;" + keys[i] );
    
    data->add( getName(), &list, getIcon() );
}

const TQPixmap FilePlugin::getIcon() const 
{
    return tdeApp->iconLoader()->loadIcon( m_icon, TDEIcon::Small );
}

bool FilePlugin::supports( const TQString & token )
{
    for( unsigned int i = 0; i < keys.count(); i++ )
        if( TQRegExp( keys[i].lower() ).exactMatch( token.lower() ) )
            return true;
            
    return false;
}

void FilePlugin::clearCache()
{
    cache.clear();
}

#include "fileplugin.moc"
