/*
    This file is part of KAddressBook.
    Copyright (c) 2002 Mike Pilone <mpilone@slac.com>

    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.

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

    As a special exception, permission is given to link this program
    with any edition of TQt, and distribute the resulting executable,
    without including the source code for TQt in the source distribution.
*/

#include <tqapplication.h>
#include <tqiconview.h>
#include <tqlayout.h>
#include <tqstringlist.h>

#include <tdeabc/addressbook.h>
#include <tdeabc/addressee.h>
#include <tdeconfig.h>
#include <kdebug.h>
#include <tdeglobal.h>
#include <kiconloader.h>
#include <tdelocale.h>

#include "core.h"
#include "kabprefs.h"

#include "kaddressbookiconview.h"

class IconViewFactory : public ViewFactory
{
  public:
    KAddressBookView *view( KAB::Core *core, TQWidget *parent, const char *name )
    {
      return new KAddressBookIconView( core, parent, name );
    }

    TQString type() const { return I18N_NOOP( "Icon" ); }

    TQString description() const { return i18n( "Icons represent contacts. Very simple view." ); }
};

extern "C" {
  void *init_libkaddrbk_iconview()
  {
    return ( new IconViewFactory );
  }
}

AddresseeIconView::AddresseeIconView( TQWidget *parent, const char *name )
  : TDEIconView( parent, name )
{
  setSelectionMode( TQIconView::Extended );
  setResizeMode( TQIconView::Adjust );
  setWordWrapIconText( true );
  setGridX( 100 );
  setItemsMovable( false );
  setSorting( true, true );
  setMode( TDEIconView::Select );

  connect( this, TQ_SIGNAL( dropped( TQDropEvent*, const TQValueList<TQIconDragItem>& ) ),
           this, TQ_SLOT( itemDropped( TQDropEvent*, const TQValueList<TQIconDragItem>& ) ) );
}

AddresseeIconView::~AddresseeIconView()
{
}

void AddresseeIconView::itemDropped( TQDropEvent *event, const TQValueList<TQIconDragItem>& )
{
  emit addresseeDropped( event );
}

TQDragObject *AddresseeIconView::dragObject()
{
  emit startAddresseeDrag();

  // We never want IconView to start the drag
  return 0;
}


class AddresseeIconViewItem : public TDEIconViewItem
{
  public:
    AddresseeIconViewItem( const TDEABC::Field::List&, TDEABC::AddressBook *doc,
                           const TDEABC::Addressee &addr, TQIconView *parent )
      : TDEIconViewItem( parent ), mDocument( doc ), mAddressee( addr )
      {
        refresh();
      }

    const TDEABC::Addressee &addressee() const { return mAddressee; }

    void refresh()
    {
      mAddressee = mDocument->findByUid( mAddressee.uid() );

      if ( !mAddressee.isEmpty() )
        setText( mAddressee.givenName() + " " + mAddressee.familyName() );

      TQPixmap icon;
      TQPixmap defaultIcon( TDEGlobal::iconLoader()->loadIcon( "x-office-address-book", TDEIcon::Desktop ) );
      TDEABC::Picture pic = mAddressee.photo();
      if ( pic.data().isNull() )
        pic = mAddressee.logo();

      if ( pic.isIntern() && !pic.data().isNull() ) {
        TQImage img = pic.data();
        if ( img.width() > img.height() )
          icon = img.scaleWidth( 32 );
        else
          icon = img.scaleHeight( 32 );
      } else
        icon = defaultIcon;

      setPixmap( icon );
    }

  private:
    TDEABC::AddressBook *mDocument;
    TDEABC::Addressee mAddressee;
};


KAddressBookIconView::KAddressBookIconView( KAB::Core *core,
                                            TQWidget *parent, const char *name)
  : KAddressBookView( core, parent, name )
{
  TQVBoxLayout *layout = new TQVBoxLayout( viewWidget() );

  mIconView = new AddresseeIconView( viewWidget(), "mIconView" );
  layout->addWidget( mIconView );

  // Connect up the signals
  connect( mIconView, TQ_SIGNAL( executed( TQIconViewItem* ) ),
           this, TQ_SLOT( addresseeExecuted( TQIconViewItem* ) ) );
  connect( mIconView, TQ_SIGNAL( selectionChanged() ),
           this, TQ_SLOT( addresseeSelected() ) );
  connect( mIconView, TQ_SIGNAL( addresseeDropped( TQDropEvent* ) ),
           this, TQ_SIGNAL( dropped( TQDropEvent* ) ) );
  connect( mIconView, TQ_SIGNAL( startAddresseeDrag() ),
           this, TQ_SIGNAL( startDrag() ) );
  connect( mIconView, TQ_SIGNAL( contextMenuRequested( TQIconViewItem*, const TQPoint& ) ),
           this, TQ_SLOT( rmbClicked( TQIconViewItem*, const TQPoint& ) ) );
}

KAddressBookIconView::~KAddressBookIconView()
{
}

TDEABC::Field *KAddressBookIconView::sortField() const
{
  // we have hardcoded sorting, so we have to return a hardcoded field :(
  return TDEABC::Field::allFields()[ 2 ];
}

void KAddressBookIconView::readConfig( TDEConfig *config )
{
  KAddressBookView::readConfig( config );

  disconnect( mIconView, TQ_SIGNAL( executed( TQIconViewItem* ) ),
              this, TQ_SLOT( addresseeExecuted( TQIconViewItem* ) ) );

  if ( KABPrefs::instance()->honorSingleClick() )
    connect( mIconView, TQ_SIGNAL( executed( TQIconViewItem* ) ),
             this, TQ_SLOT( addresseeExecuted( TQIconViewItem* ) ) );
  else
    connect( mIconView, TQ_SIGNAL( doubleClicked( TQIconViewItem* ) ),
             this, TQ_SLOT( addresseeExecuted( TQIconViewItem* ) ) );
}

TQStringList KAddressBookIconView::selectedUids()
{
  TQStringList uidList;
  TQIconViewItem *item;
  AddresseeIconViewItem *aItem;

  for ( item = mIconView->firstItem(); item; item = item->nextItem() ) {
    if ( item->isSelected() ) {
      aItem = dynamic_cast<AddresseeIconViewItem*>( item );
      if ( aItem )
        uidList << aItem->addressee().uid();
    }
  }

  return uidList;
}

void KAddressBookIconView::refresh( const TQString &uid )
{
  TQIconViewItem *item;
  AddresseeIconViewItem *aItem;

  if ( uid.isEmpty() ) {
    // Rebuild the view
    mIconView->clear();
    mIconList.clear();

    const TDEABC::Addressee::List addresseeList( addressees() );
    TDEABC::Addressee::List::ConstIterator it( addresseeList.begin() );
    const TDEABC::Addressee::List::ConstIterator endIt( addresseeList.end() );
    for ( ; it != endIt; ++it )
      aItem = new AddresseeIconViewItem( fields(), core()->addressBook(), *it, mIconView );

    mIconView->arrangeItemsInGrid( true );

    for ( item = mIconView->firstItem(); item; item = item->nextItem() ) {
      AddresseeIconViewItem* aivi = dynamic_cast<AddresseeIconViewItem*>( item );
      mIconList.append( aivi );
    }

  } else {
    // Try to find the one to refresh
    for ( item = mIconView->firstItem(); item; item = item->nextItem() ) {
      aItem = dynamic_cast<AddresseeIconViewItem*>( item );
      if ( aItem && (aItem->addressee().uid() == uid) ) {
        aItem->refresh();
        mIconView->arrangeItemsInGrid( true );
        return;
      }
    }

    refresh( TQString() );
  }
}

void KAddressBookIconView::setSelected( const TQString &uid, bool selected )
{
  TQIconViewItem *item;
  AddresseeIconViewItem *aItem;

  if ( uid.isEmpty() ) {
    mIconView->selectAll( selected );
  } else {
    bool found = false;
    for ( item = mIconView->firstItem(); item && !found; item = item->nextItem() ) {

      aItem = dynamic_cast<AddresseeIconViewItem*>( item );
      if ( aItem && (aItem->addressee().uid() == uid) ) {
        mIconView->setSelected( aItem, selected );
        mIconView->ensureItemVisible( aItem );
        found = true;
      }
    }
  }
}

void KAddressBookIconView::setFirstSelected( bool selected )
{
  if ( mIconView->firstItem() ) {
    mIconView->setSelected( mIconView->firstItem(), selected );
    mIconView->ensureItemVisible( mIconView->firstItem() );
  }
}

void KAddressBookIconView::addresseeExecuted( TQIconViewItem *item )
{
  AddresseeIconViewItem *aItem = dynamic_cast<AddresseeIconViewItem*>( item );

  if ( aItem )
    emit executed( aItem->addressee().uid() );
}

void KAddressBookIconView::addresseeSelected()
{
  TQIconViewItem *item;
  AddresseeIconViewItem *aItem;

  bool found = false;
  for ( item = mIconView->firstItem(); item && !found; item = item->nextItem() ) {
    if ( item->isSelected() ) {
      aItem = dynamic_cast<AddresseeIconViewItem*>( item );
      if ( aItem ) {
        emit selected( aItem->addressee().uid() );
        found = true;
      }
    }
  }

  if ( !found )
    emit selected( TQString() );
}

void KAddressBookIconView::rmbClicked( TQIconViewItem*, const TQPoint &point )
{
  popup( point );
}

void KAddressBookIconView::scrollUp()
{
  TQApplication::postEvent( mIconView, new TQKeyEvent( TQEvent::KeyPress, TQt::Key_Up, 0, 0 ) );
}

void KAddressBookIconView::scrollDown()
{
  TQApplication::postEvent( mIconView, new TQKeyEvent( TQEvent::KeyPress, TQt::Key_Down, 0, 0 ) );
}

#include "kaddressbookiconview.moc"
