/*
    This file is part of libkcal.

    Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
    Copyright (c) 2004 Till Adam <adam@kde.org>
    Copyright (c) 2005 Reinhold Kainhofer <reinhold@kainhofer.com>

    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.
*/

#include "folderconfig.h"

#include "folderlister.h"
#include "groupwaredataadaptor.h"
#include "folderlistview.h"

#include <tdelistview.h>
#include <tdelocale.h>
#include <kdebug.h>
#include <kdialog.h>

#include <tqlayout.h>
#include <tqgroupbox.h>
#include <tqpushbutton.h>
#include <tqcombobox.h>
#include <tqhbox.h>
#include <tqlabel.h>

using namespace KPIM;

FolderConfig::FolderConfig( TQWidget *parent )
  : TQWidget( parent ), mFolderLister( 0 )
{
  TQBoxLayout *topLayout = new TQVBoxLayout( this );
  topLayout->addSpacing( KDialog::spacingHint() );

  TQGroupBox *topBox = new TQGroupBox( 1, TQt::Horizontal, i18n("Folder Selection"),
    this );
  topLayout->addWidget( topBox );
  
  TQPushButton *button = new TQPushButton( i18n("Update Folder List"), topBox );
  connect( button, TQ_SIGNAL( clicked() ), TQ_SIGNAL( updateFoldersClicked() ) );
  
  mFolderList = new FolderListView( topBox );

/*  TQHBox *writeBox = new TQHBox( topBox );

  new TQLabel( i18n("Write to:"), writeBox );
  
  mWriteCombo = new TQComboBox( writeBox );*/
}

FolderConfig::~FolderConfig()
{
}

void FolderConfig::setFolderLister( FolderLister *f )
{
  mFolderLister = f;
  
  TQValueList<FolderListView::Property> types;
  TQValueList<FolderLister::ContentType> suptypes( mFolderLister->supportedTypes() );
  if ( suptypes.contains( FolderLister::Event ) ) types << FolderListView::Event;
  if ( suptypes.contains( FolderLister::Todo ) ) types << FolderListView::Todo;
  if ( suptypes.contains( FolderLister::Journal ) ) types << FolderListView::Journal;
  if ( suptypes.contains( FolderLister::Contact ) ) types << FolderListView::Contact;
  if ( suptypes.contains( FolderLister::All ) ) types << FolderListView::All;
  if ( suptypes.contains( FolderLister::Unknown ) ) types << FolderListView::Unknown;

  mFolderList->setEnabledTypes( types );
  connect( mFolderLister, TQ_SIGNAL( foldersRead() ), TQ_SLOT( updateFolderList() ) );
}

void FolderConfig::retrieveFolderList( const KURL &url )
{
  kdDebug(7000) << "FolderConfig::retrieveFolderList()" << endl;
  if ( !mOldFolderListerURL.isEmpty() ) return;

  if ( mFolderLister->adaptor() ) {
    mOldFolderListerURL = mFolderLister->adaptor()->baseURL();
    mFolderLister->adaptor()->setBaseURL( url );
  }
  mFolderLister->retrieveFolders( url );
}

void FolderConfig::updateFolderList()
{
  mFolderList->clear();

  TQStringList write;

  if ( !mOldFolderListerURL.isEmpty() && mFolderLister->adaptor() ) {
    mFolderLister->adaptor()->setBaseURL( mOldFolderListerURL );
    mOldFolderListerURL = KURL();
  }

  FolderLister::Entry::List folders = mFolderLister->folders();
  FolderLister::Entry::List::ConstIterator it;
  for( it = folders.begin(); it != folders.end(); ++it ) {
    FolderListItem *item = new FolderListItem( mFolderList, (*it) );
    if ( mFolderLister->writeDestinationId( FolderLister::Event ) == (*it).id ) {
      item->setDefault( FolderListView::Event );
    }
    if ( mFolderLister->writeDestinationId( FolderLister::Todo ) == (*it).id ) {
      item->setDefault( FolderListView::Todo );
    }
    if ( mFolderLister->writeDestinationId( FolderLister::Journal ) == (*it).id ) {
      item->setDefault( FolderListView::Journal );
    }
    if ( mFolderLister->writeDestinationId( FolderLister::Contact ) == (*it).id ) {
      item->setDefault( FolderListView::Contact );
    }
    if ( mFolderLister->writeDestinationId( FolderLister::All ) == (*it).id ) {
      item->setDefault( FolderListView::All );
    }
    if ( mFolderLister->writeDestinationId( FolderLister::Unknown ) == (*it).id ) {
      item->setDefault( FolderListView::Unknown );
    }
  }
}

void FolderConfig::saveSettings()
{
  TQPtrList<TQListViewItem> lst;

  FolderLister::Entry::List folders;

  TQListViewItemIterator it( mFolderList );
  while ( it.current() ) {
    FolderListItem *item = dynamic_cast<FolderListItem *>( it.current() );
    if ( item ) {
      FolderLister::Entry folder = item->folder();
      folder.active = item->isOn();
      folders.append( folder );
      if ( item->isDefault( FolderListView::Event ) ) {
        mFolderLister->setWriteDestinationId( FolderLister::Event, folder.id );
      }
      if ( item->isDefault( FolderListView::Todo ) ) {
        mFolderLister->setWriteDestinationId( FolderLister::Todo, folder.id );
      }
      if ( item->isDefault( FolderListView::Journal ) ) {
        mFolderLister->setWriteDestinationId( FolderLister::Journal, folder.id );
      }
      if ( item->isDefault( FolderListView::Contact ) ) {
        mFolderLister->setWriteDestinationId( FolderLister::Contact, folder.id );
      }
      if ( item->isDefault( FolderListView::All ) ) {
        mFolderLister->setWriteDestinationId( FolderLister::All, folder.id );
      }
      if ( item->isDefault( FolderListView::Unknown ) ) {
        mFolderLister->setWriteDestinationId( FolderLister::Unknown, folder.id );
      }
    }
    ++it;
  }

  mFolderLister->setFolders( folders );
}

#include "folderconfig.moc"
