diff options
Diffstat (limited to 'kaddressbook/views/kaddressbookcardview.cpp')
-rw-r--r-- | kaddressbook/views/kaddressbookcardview.cpp | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/kaddressbook/views/kaddressbookcardview.cpp b/kaddressbook/views/kaddressbookcardview.cpp new file mode 100644 index 000000000..d65c4d71f --- /dev/null +++ b/kaddressbook/views/kaddressbookcardview.cpp @@ -0,0 +1,370 @@ +/* + 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 Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qapplication.h> +#include <qdragobject.h> +#include <qevent.h> +#include <qiconview.h> +#include <qlayout.h> +#include <qstringlist.h> + +#include <kabc/addressbook.h> +#include <kabc/addressee.h> +#include <kconfig.h> +#include <kdebug.h> +#include <klocale.h> + +#include "core.h" +#include "configurecardviewdialog.h" +#include "kabprefs.h" + +#include "kaddressbookcardview.h" + +class CardViewFactory : public ViewFactory +{ + public: + KAddressBookView *view( KAB::Core *core, QWidget *parent, const char *name ) + { + return new KAddressBookCardView( core, parent, name ); + } + + QString type() const { return I18N_NOOP("Card"); } + + QString description() const { return i18n( "Rolodex style cards represent contacts." ); } + + ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, QWidget *parent, + const char *name = 0 ) + { + return new ConfigureCardViewWidget( ab, parent, name ); + } +}; + +extern "C" { + void *init_libkaddrbk_cardview() + { + return ( new CardViewFactory ); + } +} + +class AddresseeCardViewItem : public CardViewItem +{ + public: + AddresseeCardViewItem( const KABC::Field::List &fields, + bool showEmptyFields, + KABC::AddressBook *doc, const KABC::Addressee &addr, + CardView *parent ) + : CardViewItem( parent, addr.realName() ), + mFields( fields ), mShowEmptyFields( showEmptyFields ), + mDocument( doc ), mAddressee( addr ) + { + if ( mFields.isEmpty() ) + mFields = KABC::Field::defaultFields(); + + refresh(); + } + + const KABC::Addressee &addressee() const { return mAddressee; } + + void refresh() + { + mAddressee = mDocument->findByUid( mAddressee.uid() ); + + if ( !mAddressee.isEmpty() ) { + clearFields(); + + KABC::Field::List::ConstIterator it( mFields.begin() ); + const KABC::Field::List::ConstIterator endIt( mFields.end() ); + for ( ; it != endIt; ++it ) { + // insert empty fields or not? not doing so saves a bit of memory and CPU + // (during geometry calculations), but prevents having equally + // wide label columns in all cards, unless CardViewItem/CardView search + // globally for the widest label. (anders) + + // if ( mShowEmptyFields || !(*it)->value( mAddressee ).isEmpty() ) + insertField( (*it)->label(), (*it)->value( mAddressee ) ); + } + + setCaption( mAddressee.realName() ); + } + } + + private: + KABC::Field::List mFields; + bool mShowEmptyFields; + KABC::AddressBook *mDocument; + KABC::Addressee mAddressee; +}; + + +AddresseeCardView::AddresseeCardView( QWidget *parent, const char *name ) + : CardView( parent, name ) +{ + setAcceptDrops( true ); +} + +AddresseeCardView::~AddresseeCardView() +{ +} + +void AddresseeCardView::dragEnterEvent( QDragEnterEvent *event ) +{ + if ( QTextDrag::canDecode( event ) ) + event->accept(); +} + +void AddresseeCardView::dropEvent( QDropEvent *event ) +{ + emit addresseeDropped( event ); +} + +void AddresseeCardView::startDrag() +{ + emit startAddresseeDrag(); +} + + +KAddressBookCardView::KAddressBookCardView( KAB::Core *core, + QWidget *parent, const char *name ) + : KAddressBookView( core, parent, name ) +{ + mShowEmptyFields = false; + + QVBoxLayout *layout = new QVBoxLayout( viewWidget() ); + + mCardView = new AddresseeCardView( viewWidget(), "mCardView" ); + mCardView->setSelectionMode( CardView::Extended ); + layout->addWidget( mCardView ); + + // Connect up the signals + connect( mCardView, SIGNAL( executed( CardViewItem* ) ), + this, SLOT( addresseeExecuted( CardViewItem* ) ) ); + connect( mCardView, SIGNAL( selectionChanged() ), + this, SLOT( addresseeSelected() ) ); + connect( mCardView, SIGNAL( addresseeDropped( QDropEvent* ) ), + this, SIGNAL( dropped( QDropEvent* ) ) ); + connect( mCardView, SIGNAL( startAddresseeDrag() ), + this, SIGNAL( startDrag() ) ); + connect( mCardView, SIGNAL( contextMenuRequested( CardViewItem*, const QPoint& ) ), + this, SLOT( rmbClicked( CardViewItem*, const QPoint& ) ) ); +} + +KAddressBookCardView::~KAddressBookCardView() +{ +} + +KABC::Field *KAddressBookCardView::sortField() const +{ + // we have hardcoded sorting, so we have to return a hardcoded field :( + return KABC::Field::allFields()[ 0 ]; +} + +void KAddressBookCardView::readConfig( KConfig *config ) +{ + KAddressBookView::readConfig( config ); + + // costum colors? + if ( config->readBoolEntry( "EnableCustomColors", false ) ) { + QPalette p( mCardView->palette() ); + QColor c = p.color( QPalette::Normal, QColorGroup::Base ); + p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) ); + c = p.color( QPalette::Normal, QColorGroup::Text ); + p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) ); + c = p.color( QPalette::Normal, QColorGroup::Button ); + p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) ); + c = p.color( QPalette::Normal, QColorGroup::ButtonText ); + p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) ); + c = p.color( QPalette::Normal, QColorGroup::Highlight ); + p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) ); + c = p.color( QPalette::Normal, QColorGroup::HighlightedText ); + p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) ); + mCardView->viewport()->setPalette( p ); + } else { + // needed if turned off during a session. + mCardView->viewport()->setPalette( mCardView->palette() ); + } + + //custom fonts? + QFont f( font() ); + if ( config->readBoolEntry( "EnableCustomFonts", false ) ) { + mCardView->setFont( config->readFontEntry( "TextFont", &f ) ); + f.setBold( true ); + mCardView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) ); + } else { + mCardView->setFont( f ); + f.setBold( true ); + mCardView->setHeaderFont( f ); + } + + mCardView->setDrawCardBorder( config->readBoolEntry( "DrawBorder", true ) ); + mCardView->setDrawColSeparators( config->readBoolEntry( "DrawSeparators", true ) ); + mCardView->setDrawFieldLabels( config->readBoolEntry( "DrawFieldLabels", false ) ); + mShowEmptyFields = config->readBoolEntry( "ShowEmptyFields", false ); + + mCardView->setShowEmptyFields( mShowEmptyFields ); + + mCardView->setItemWidth( config->readNumEntry( "ItemWidth", 200 ) ); + mCardView->setItemMargin( config->readNumEntry( "ItemMargin", 0 ) ); + mCardView->setItemSpacing( config->readNumEntry( "ItemSpacing", 10 ) ); + mCardView->setSeparatorWidth( config->readNumEntry( "SeparatorWidth", 2 ) ); + + disconnect( mCardView, SIGNAL( executed( CardViewItem* ) ), + this, SLOT( addresseeExecuted( CardViewItem* ) ) ); + + if ( KABPrefs::instance()->honorSingleClick() ) + connect( mCardView, SIGNAL( executed( CardViewItem* ) ), + this, SLOT( addresseeExecuted( CardViewItem* ) ) ); + else + connect( mCardView, SIGNAL( doubleClicked( CardViewItem* ) ), + this, SLOT( addresseeExecuted( CardViewItem* ) ) ); +} + +void KAddressBookCardView::writeConfig( KConfig *config ) +{ + config->writeEntry( "ItemWidth", mCardView->itemWidth() ); + KAddressBookView::writeConfig( config ); +} + +QStringList KAddressBookCardView::selectedUids() +{ + QStringList uidList; + CardViewItem *item; + AddresseeCardViewItem *aItem; + + for ( item = mCardView->firstItem(); item; item = item->nextItem() ) { + if ( item->isSelected() ) { + aItem = dynamic_cast<AddresseeCardViewItem*>( item ); + if ( aItem ) + uidList << aItem->addressee().uid(); + } + } + + return uidList; +} + +void KAddressBookCardView::refresh( const QString &uid ) +{ + CardViewItem *item; + AddresseeCardViewItem *aItem; + + if ( uid.isEmpty() ) { + // Rebuild the view + mCardView->viewport()->setUpdatesEnabled( false ); + mCardView->clear(); + + const KABC::Addressee::List addresseeList( addressees() ); + KABC::Addressee::List::ConstIterator it( addresseeList.begin() ); + const KABC::Addressee::List::ConstIterator endIt( addresseeList.end() ); + for ( ; it != endIt; ++it ) { + aItem = new AddresseeCardViewItem( fields(), mShowEmptyFields, + core()->addressBook(), *it, mCardView ); + } + mCardView->viewport()->setUpdatesEnabled( true ); + mCardView->viewport()->update(); + + // by default nothing is selected + emit selected( QString::null ); + } else { + // Try to find the one to refresh + bool found = false; + for ( item = mCardView->firstItem(); item && !found; item = item->nextItem() ) { + aItem = dynamic_cast<AddresseeCardViewItem*>( item ); + if ( aItem && (aItem->addressee().uid() == uid) ) { + aItem->refresh(); + found = true; + } + } + } +} + +void KAddressBookCardView::setSelected( const QString &uid, bool selected ) +{ + CardViewItem *item; + AddresseeCardViewItem *aItem; + + if ( uid.isEmpty() ) { + mCardView->selectAll( selected ); + } else { + bool found = false; + for ( item = mCardView->firstItem(); item && !found; item = item->nextItem() ) { + aItem = dynamic_cast<AddresseeCardViewItem*>( item ); + + if ( aItem && (aItem->addressee().uid() == uid) ) { + mCardView->setSelected( aItem, selected ); + mCardView->ensureItemVisible( item ); + found = true; + } + } + } +} + +void KAddressBookCardView::setFirstSelected( bool selected ) +{ + if ( mCardView->firstItem() ) { + mCardView->setSelected( mCardView->firstItem(), selected ); + mCardView->ensureItemVisible( mCardView->firstItem() ); + } +} + +void KAddressBookCardView::addresseeExecuted( CardViewItem *item ) +{ + AddresseeCardViewItem *aItem = dynamic_cast<AddresseeCardViewItem*>( item ); + if ( aItem ) + emit executed( aItem->addressee().uid() ); +} + +void KAddressBookCardView::addresseeSelected() +{ + CardViewItem *item; + AddresseeCardViewItem *aItem; + + bool found = false; + for ( item = mCardView->firstItem(); item && !found; item = item->nextItem() ) { + if ( item->isSelected() ) { + aItem = dynamic_cast<AddresseeCardViewItem*>( item ); + if ( aItem ) { + emit selected( aItem->addressee().uid() ); + found = true; + } + } + } + + if ( !found ) + emit selected( QString::null ); +} + +void KAddressBookCardView::rmbClicked( CardViewItem*, const QPoint &point ) +{ + popup( point ); +} + +void KAddressBookCardView::scrollUp() +{ + QApplication::postEvent( mCardView, new QKeyEvent( QEvent::KeyPress, Qt::Key_Up, 0, 0 ) ); +} + +void KAddressBookCardView::scrollDown() +{ + QApplication::postEvent( mCardView, new QKeyEvent( QEvent::KeyPress, Qt::Key_Down, 0, 0 ) ); +} + +#include "kaddressbookcardview.moc" |