summaryrefslogtreecommitdiffabout
path: root/kaddressbook/views/kaddressbookcardview.cpp
authorzautrix <zautrix>2004-06-26 19:01:18 (UTC)
committer zautrix <zautrix>2004-06-26 19:01:18 (UTC)
commitb9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (side-by-side diff)
tree2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /kaddressbook/views/kaddressbookcardview.cpp
downloadkdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2
Initial revision
Diffstat (limited to 'kaddressbook/views/kaddressbookcardview.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/views/kaddressbookcardview.cpp394
1 files changed, 394 insertions, 0 deletions
diff --git a/kaddressbook/views/kaddressbookcardview.cpp b/kaddressbook/views/kaddressbookcardview.cpp
new file mode 100644
index 0000000..239429f
--- a/dev/null
+++ b/kaddressbook/views/kaddressbookcardview.cpp
@@ -0,0 +1,394 @@
+/*
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 <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 "kabprefs.h"
+#include "viewmanager.h"
+
+#include "kaddressbookcardview.h"
+
+#ifndef KAB_EMBEDDED
+extern "C" {
+ void *init_libkaddrbk_cardview()
+ {
+ return ( new CardViewFactory );
+ }
+}
+#endif //KAB_EMBEDDED
+
+////////////////////////////////
+// AddresseeCardViewItem (internal class)
+class AddresseeCardViewItem : public CardViewItem
+{
+ public:
+ AddresseeCardViewItem(const KABC::Field::List &fields,
+ bool showEmptyFields,
+ KABC::AddressBook *doc, const KABC::Addressee &a,
+ CardView *parent)
+ : CardViewItem(parent, a.formattedName()),
+ mFields( fields ), mShowEmptyFields(showEmptyFields),
+ mDocument(doc), mAddressee(a)
+ {
+ if ( mFields.isEmpty() ) {
+ mFields = KABC::Field::defaultFields();
+ }
+ refresh();
+ }
+
+ const KABC::Addressee &addressee() const { return mAddressee; }
+
+ void refresh()
+ {
+ // Update our addressee, since it may have changed elsewhere
+ mAddressee = mDocument->findByUid(mAddressee.uid());
+
+ if (!mAddressee.isEmpty())
+ {
+ clearFields();
+
+ // Try all the selected fields until we find one with text.
+ // This will limit the number of unlabeled icons in the view
+ KABC::Field::List::Iterator iter;
+ for (iter = mFields.begin(); iter != mFields.end(); ++iter)
+ {
+ // 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 || !(*iter)->value( mAddressee ).isEmpty())
+ insertField((*iter)->label(), (*iter)->value( mAddressee ));
+ }
+
+ // We might want to make this the first field. hmm... -mpilone
+ setCaption( mAddressee.realName() );
+ }
+ }
+
+ private:
+ KABC::Field::List mFields;
+ bool mShowEmptyFields;
+ KABC::AddressBook *mDocument;
+ KABC::Addressee mAddressee;
+};
+
+///////////////////////////////
+// AddresseeCardView
+
+AddresseeCardView::AddresseeCardView(QWidget *parent, const char *name)
+ : CardView(parent, name)
+{
+ setAcceptDrops(true);
+}
+
+AddresseeCardView::~AddresseeCardView()
+{
+}
+
+void AddresseeCardView::dragEnterEvent(QDragEnterEvent *e)
+{
+#ifndef KAB_EMBEDDED
+ if (QTextDrag::canDecode(e))
+ e->accept();
+#else //KAB_EMBEDDED
+qDebug("AddresseeCardView::dragEnterEvent drag&drop is not implemented");
+#endif //KAB_EMBEDDED
+}
+
+void AddresseeCardView::dropEvent(QDropEvent *e)
+{
+ emit addresseeDropped(e);
+}
+
+void AddresseeCardView::startDrag()
+{
+ emit startAddresseeDrag();
+}
+
+
+///////////////////////////////
+// KAddressBookCardView
+
+KAddressBookCardView::KAddressBookCardView( KABC::AddressBook *ab,
+ QWidget *parent, const char *name )
+ : KAddressBookView( ab, parent, name )
+{
+ mShowEmptyFields = false;
+
+ // Init the GUI
+ 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()));
+}
+
+KAddressBookCardView::~KAddressBookCardView()
+{
+}
+
+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()->mHonorSingleClick)
+ 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())
+ {
+#ifndef KAB_EMBEDDED
+ aItem = dynamic_cast<AddresseeCardViewItem*>(item);
+#else //KAB_EMBEDDED
+ aItem = (AddresseeCardViewItem*)(item);
+#endif //KAB_EMBEDDED
+ if (aItem)
+ uidList << aItem->addressee().uid();
+ }
+ }
+
+ return uidList;
+}
+
+void KAddressBookCardView::refresh(QString uid)
+{
+ CardViewItem *item;
+ AddresseeCardViewItem *aItem;
+
+ if (uid.isNull())
+ {
+ // Rebuild the view
+ mCardView->viewport()->setUpdatesEnabled( false );
+ mCardView->clear();
+
+ KABC::Addressee::List addresseeList = addressees();
+ KABC::Addressee::List::Iterator iter;
+ for (iter = addresseeList.begin(); iter != addresseeList.end(); ++iter)
+ {
+ aItem = new AddresseeCardViewItem(fields(), mShowEmptyFields,
+ addressBook(), *iter, 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())
+ {
+#ifndef KAB_EMBEDDED
+ aItem = dynamic_cast<AddresseeCardViewItem*>(item);
+#else //KAB_EMBEDDED
+ aItem = (AddresseeCardViewItem*)(item);
+#endif //KAB_EMBEDDED
+
+ if ((aItem) && (aItem->addressee().uid() == uid))
+ {
+ aItem->refresh();
+ found = true;
+ }
+ }
+ }
+}
+
+void KAddressBookCardView::setSelected(QString uid, bool selected)
+{
+ CardViewItem *item;
+ AddresseeCardViewItem *aItem;
+
+ if (uid.isNull())
+ {
+ mCardView->selectAll(selected);
+ }
+ else
+ {
+ bool found = false;
+ for (item = mCardView->firstItem(); item && !found;
+ item = item->nextItem())
+ {
+#ifndef KAB_EMBEDDED
+ aItem = dynamic_cast<AddresseeCardViewItem*>(item);
+#else //KAB_EMBEDDED
+ aItem = (AddresseeCardViewItem*)(item);
+#endif //KAB_EMBEDDED
+
+ if ((aItem) && (aItem->addressee().uid() == uid))
+ {
+ mCardView->setSelected(aItem, selected);
+ mCardView->ensureItemVisible(item);
+ found = true;
+ }
+ }
+ }
+}
+
+//US added an additional method without parameter
+void KAddressBookCardView::setSelected()
+{
+ setSelected(QString::null, true);
+}
+
+void KAddressBookCardView::addresseeExecuted(CardViewItem *item)
+{
+#ifndef KAB_EMBEDDED
+ AddresseeCardViewItem *aItem = dynamic_cast<AddresseeCardViewItem*>(item);
+#else //KAB_EMBEDDED
+ AddresseeCardViewItem *aItem = (AddresseeCardViewItem*)(item);
+#endif //KAB_EMBEDDED
+ if (aItem)
+ {
+ //kdDebug()<<"... even has a valid item:)"<<endl;
+ 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())
+ {
+#ifndef KAB_EMBEDDED
+ aItem = dynamic_cast<AddresseeCardViewItem*>(item);
+#else //KAB_EMBEDDED
+ aItem = (AddresseeCardViewItem*)(item);
+#endif //KAB_EMBEDDED
+ if ( aItem )
+ {
+ emit selected(aItem->addressee().uid());
+ found = true;
+ }
+ }
+ }
+
+ if (!found)
+ emit selected(QString::null);
+
+}
+#ifndef KAB_EMBEDDED
+#include "kaddressbookcardview.moc"
+#endif //KAB_EMBEDDED