00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qdragobject.h>
00025 #include <qevent.h>
00026 #include <qiconview.h>
00027 #include <qlayout.h>
00028 #include <qstringlist.h>
00029
00030 #include <kabc/addressbook.h>
00031 #include <kabc/addressee.h>
00032 #include <kconfig.h>
00033 #include <kdebug.h>
00034 #include <klocale.h>
00035
00036 #include "core.h"
00037 #include "configurecardviewdialog.h"
00038 #include "kabprefs.h"
00039
00040 #include "kaddressbookcardview.h"
00041
00042 class CardViewFactory : public ViewFactory
00043 {
00044 public:
00045 KAddressBookView *view( KAB::Core *core, QWidget *parent, const char *name )
00046 {
00047 return new KAddressBookCardView( core, parent, name );
00048 }
00049
00050 QString type() const { return I18N_NOOP("Card"); }
00051
00052 QString description() const { return i18n( "Rolodex style cards represent contacts." ); }
00053
00054 ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, QWidget *parent,
00055 const char *name = 0 )
00056 {
00057 return new ConfigureCardViewWidget( ab, parent, name );
00058 }
00059 };
00060
00061 extern "C" {
00062 void *init_libkaddrbk_cardview()
00063 {
00064 return ( new CardViewFactory );
00065 }
00066 }
00067
00069
00070 class AddresseeCardViewItem : public CardViewItem
00071 {
00072 public:
00073 AddresseeCardViewItem(const KABC::Field::List &fields,
00074 bool showEmptyFields,
00075 KABC::AddressBook *doc, const KABC::Addressee &a,
00076 CardView *parent)
00077 : CardViewItem(parent, a.formattedName()),
00078 mFields( fields ), mShowEmptyFields(showEmptyFields),
00079 mDocument(doc), mAddressee(a)
00080 {
00081 if ( mFields.isEmpty() ) {
00082 mFields = KABC::Field::defaultFields();
00083 }
00084 refresh();
00085 }
00086
00087 const KABC::Addressee &addressee() const { return mAddressee; }
00088
00089 void refresh()
00090 {
00091
00092 mAddressee = mDocument->findByUid(mAddressee.uid());
00093
00094 if (!mAddressee.isEmpty())
00095 {
00096 clearFields();
00097
00098
00099
00100 KABC::Field::List::Iterator iter;
00101 for (iter = mFields.begin(); iter != mFields.end(); ++iter)
00102 {
00103
00104
00105
00106
00107
00108 insertField((*iter)->label(), (*iter)->value( mAddressee ));
00109 }
00110
00111
00112 setCaption( mAddressee.realName() );
00113 }
00114 }
00115
00116 private:
00117 KABC::Field::List mFields;
00118 bool mShowEmptyFields;
00119 KABC::AddressBook *mDocument;
00120 KABC::Addressee mAddressee;
00121 };
00122
00124
00125
00126 AddresseeCardView::AddresseeCardView(QWidget *parent, const char *name)
00127 : CardView(parent, name)
00128 {
00129 setAcceptDrops(true);
00130 }
00131
00132 AddresseeCardView::~AddresseeCardView()
00133 {
00134 }
00135
00136 void AddresseeCardView::dragEnterEvent(QDragEnterEvent *e)
00137 {
00138 if (QTextDrag::canDecode(e))
00139 e->accept();
00140 }
00141
00142 void AddresseeCardView::dropEvent(QDropEvent *e)
00143 {
00144 emit addresseeDropped(e);
00145 }
00146
00147 void AddresseeCardView::startDrag()
00148 {
00149 emit startAddresseeDrag();
00150 }
00151
00152
00154
00155
00156 KAddressBookCardView::KAddressBookCardView( KAB::Core *core,
00157 QWidget *parent, const char *name )
00158 : KAddressBookView( core, parent, name )
00159 {
00160 mShowEmptyFields = false;
00161
00162
00163 QVBoxLayout *layout = new QVBoxLayout(viewWidget());
00164
00165 mCardView = new AddresseeCardView(viewWidget(), "mCardView");
00166 mCardView->setSelectionMode(CardView::Extended);
00167 layout->addWidget(mCardView);
00168
00169
00170 connect(mCardView, SIGNAL(executed(CardViewItem *)),
00171 this, SLOT(addresseeExecuted(CardViewItem *)));
00172 connect(mCardView, SIGNAL(selectionChanged()),
00173 this, SLOT(addresseeSelected()));
00174 connect(mCardView, SIGNAL(addresseeDropped(QDropEvent*)),
00175 this, SIGNAL(dropped(QDropEvent*)));
00176 connect(mCardView, SIGNAL(startAddresseeDrag()),
00177 this, SIGNAL(startDrag()));
00178 connect( mCardView, SIGNAL( contextMenuRequested( CardViewItem*, const QPoint& ) ),
00179 this, SLOT( rmbClicked( CardViewItem*, const QPoint& ) ) );
00180 }
00181
00182 KAddressBookCardView::~KAddressBookCardView()
00183 {
00184 }
00185
00186 KABC::Field *KAddressBookCardView::sortField() const
00187 {
00188
00189 return KABC::Field::allFields()[ 0 ];
00190 }
00191
00192 void KAddressBookCardView::readConfig(KConfig *config)
00193 {
00194 KAddressBookView::readConfig(config);
00195
00196
00197 if ( config->readBoolEntry( "EnableCustomColors", false ) )
00198 {
00199 QPalette p( mCardView->palette() );
00200 QColor c = p.color(QPalette::Normal, QColorGroup::Base );
00201 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) );
00202 c = p.color(QPalette::Normal, QColorGroup::Text );
00203 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) );
00204 c = p.color(QPalette::Normal, QColorGroup::Button );
00205 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) );
00206 c = p.color(QPalette::Normal, QColorGroup::ButtonText );
00207 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) );
00208 c = p.color(QPalette::Normal, QColorGroup::Highlight );
00209 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) );
00210 c = p.color(QPalette::Normal, QColorGroup::HighlightedText );
00211 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) );
00212 mCardView->viewport()->setPalette( p );
00213 }
00214 else
00215 {
00216
00217 mCardView->viewport()->setPalette( mCardView->palette() );
00218 }
00219
00220
00221 QFont f( font() );
00222 if ( config->readBoolEntry( "EnableCustomFonts", false ) )
00223 {
00224 mCardView->setFont( config->readFontEntry( "TextFont", &f) );
00225 f.setBold( true );
00226 mCardView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) );
00227 }
00228 else
00229 {
00230 mCardView->setFont( f );
00231 f.setBold( true );
00232 mCardView->setHeaderFont( f );
00233 }
00234
00235 mCardView->setDrawCardBorder(config->readBoolEntry("DrawBorder", true));
00236 mCardView->setDrawColSeparators(config->readBoolEntry("DrawSeparators",
00237 true));
00238 mCardView->setDrawFieldLabels(config->readBoolEntry("DrawFieldLabels",false));
00239 mShowEmptyFields = config->readBoolEntry("ShowEmptyFields", false);
00240
00241 mCardView->setShowEmptyFields( mShowEmptyFields );
00242
00243 mCardView->setItemWidth( config->readNumEntry( "ItemWidth", 200 ) );
00244 mCardView->setItemMargin( config->readNumEntry( "ItemMargin", 0 ) );
00245 mCardView->setItemSpacing( config->readNumEntry( "ItemSpacing", 10 ) );
00246 mCardView->setSeparatorWidth( config->readNumEntry( "SeparatorWidth", 2 ) );
00247
00248 disconnect(mCardView, SIGNAL(executed(CardViewItem *)),
00249 this, SLOT(addresseeExecuted(CardViewItem *)));
00250
00251 if (KABPrefs::instance()->mHonorSingleClick)
00252 connect(mCardView, SIGNAL(executed(CardViewItem *)),
00253 this, SLOT(addresseeExecuted(CardViewItem *)));
00254 else
00255 connect(mCardView, SIGNAL(doubleClicked(CardViewItem *)),
00256 this, SLOT(addresseeExecuted(CardViewItem *)));
00257
00258 }
00259
00260 void KAddressBookCardView::writeConfig( KConfig *config )
00261 {
00262 config->writeEntry( "ItemWidth", mCardView->itemWidth() );
00263 KAddressBookView::writeConfig( config );
00264 }
00265
00266 QStringList KAddressBookCardView::selectedUids()
00267 {
00268 QStringList uidList;
00269 CardViewItem *item;
00270 AddresseeCardViewItem *aItem;
00271
00272 for (item = mCardView->firstItem(); item; item = item->nextItem())
00273 {
00274 if (item->isSelected())
00275 {
00276 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
00277 if (aItem)
00278 uidList << aItem->addressee().uid();
00279 }
00280 }
00281
00282 return uidList;
00283 }
00284
00285 void KAddressBookCardView::refresh(QString uid)
00286 {
00287 CardViewItem *item;
00288 AddresseeCardViewItem *aItem;
00289
00290 if (uid.isNull())
00291 {
00292
00293 mCardView->viewport()->setUpdatesEnabled( false );
00294 mCardView->clear();
00295
00296 KABC::Addressee::List addresseeList = addressees();
00297 KABC::Addressee::List::Iterator iter;
00298 for (iter = addresseeList.begin(); iter != addresseeList.end(); ++iter)
00299 {
00300 aItem = new AddresseeCardViewItem(fields(), mShowEmptyFields,
00301 core()->addressBook(), *iter, mCardView);
00302 }
00303 mCardView->viewport()->setUpdatesEnabled( true );
00304 mCardView->viewport()->update();
00305
00306
00307 emit selected(QString::null);
00308 }
00309 else
00310 {
00311
00312 bool found = false;
00313 for (item = mCardView->firstItem(); item && !found;
00314 item = item->nextItem())
00315 {
00316 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
00317 if ((aItem) && (aItem->addressee().uid() == uid))
00318 {
00319 aItem->refresh();
00320 found = true;
00321 }
00322 }
00323 }
00324 }
00325
00326 void KAddressBookCardView::setSelected(QString uid, bool selected)
00327 {
00328 CardViewItem *item;
00329 AddresseeCardViewItem *aItem;
00330
00331 if (uid.isNull())
00332 {
00333 mCardView->selectAll(selected);
00334 }
00335 else
00336 {
00337 bool found = false;
00338 for (item = mCardView->firstItem(); item && !found;
00339 item = item->nextItem())
00340 {
00341 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
00342
00343 if ((aItem) && (aItem->addressee().uid() == uid))
00344 {
00345 mCardView->setSelected(aItem, selected);
00346 mCardView->ensureItemVisible(item);
00347 found = true;
00348 }
00349 }
00350 }
00351 }
00352
00353 void KAddressBookCardView::addresseeExecuted(CardViewItem *item)
00354 {
00355 AddresseeCardViewItem *aItem = dynamic_cast<AddresseeCardViewItem*>(item);
00356 if (aItem)
00357 {
00358
00359 emit executed(aItem->addressee().uid());
00360 }
00361 }
00362
00363 void KAddressBookCardView::addresseeSelected()
00364 {
00365 CardViewItem *item;
00366 AddresseeCardViewItem *aItem;
00367
00368 bool found = false;
00369 for (item = mCardView->firstItem(); item && !found;
00370 item = item->nextItem())
00371 {
00372 if (item->isSelected())
00373 {
00374 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
00375 if ( aItem )
00376 {
00377 emit selected(aItem->addressee().uid());
00378 found = true;
00379 }
00380 }
00381 }
00382
00383 if (!found)
00384 emit selected(QString::null);
00385
00386 }
00387
00388 void KAddressBookCardView::rmbClicked( CardViewItem*, const QPoint &point )
00389 {
00390 popup( point );
00391 }
00392
00393 #include "kaddressbookcardview.moc"