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 <qlayout.h>
00025 #include <qheader.h>
00026 #include <qvbox.h>
00027 #include <qlistbox.h>
00028 #include <qwidget.h>
00029 #include <qfile.h>
00030 #include <qimage.h>
00031 #include <qcombobox.h>
00032 #include <qapplication.h>
00033 #include <qdragobject.h>
00034 #include <qevent.h>
00035 #include <qurl.h>
00036 #include <qpixmap.h>
00037
00038 #include <kabc/addressbook.h>
00039 #include <kapplication.h>
00040 #include <kconfig.h>
00041 #include <kcolorbutton.h>
00042 #include <kdebug.h>
00043 #include <kglobal.h>
00044 #include <kiconloader.h>
00045 #include <klineedit.h>
00046 #include <klocale.h>
00047 #include <kmessagebox.h>
00048 #include <kurl.h>
00049 #include <kurlrequester.h>
00050 #include <libkdepim/kimproxy.h>
00051
00052 #include "configuretableviewdialog.h"
00053 #include "contactlistview.h"
00054 #include "core.h"
00055 #include "kabprefs.h"
00056 #include "undocmds.h"
00057
00058 #include "kaddressbooktableview.h"
00059
00060 class TableViewFactory : public ViewFactory
00061 {
00062 public:
00063 KAddressBookView *view( KAB::Core *core, QWidget *parent, const char *name )
00064 {
00065 return new KAddressBookTableView( core, parent, name );
00066 }
00067
00068 QString type() const { return I18N_NOOP("Table"); }
00069
00070 QString description() const { return i18n( "A listing of contacts in a table. Each cell of "
00071 "the table holds a field of the contact." ); }
00072
00073 ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, QWidget *parent,
00074 const char *name = 0 )
00075 {
00076 return new ConfigureTableViewWidget( ab, parent, name );
00077 }
00078 };
00079
00080 extern "C" {
00081 void *init_libkaddrbk_tableview()
00082 {
00083 return ( new TableViewFactory );
00084 }
00085 }
00086
00087 KAddressBookTableView::KAddressBookTableView( KAB::Core *core,
00088 QWidget *parent, const char *name )
00089 : KAddressBookView( core, parent, name )
00090 {
00091 mainLayout = new QVBoxLayout( viewWidget(), 2 );
00092
00093
00094 mListView = 0;
00095 mIMProxy = 0;
00096 }
00097
00098 KAddressBookTableView::~KAddressBookTableView()
00099 {
00100 }
00101
00102 void KAddressBookTableView::reconstructListView()
00103 {
00104 if (mListView)
00105 {
00106 disconnect(mListView, SIGNAL(selectionChanged()),
00107 this, SLOT(addresseeSelected()));
00108 disconnect(mListView, SIGNAL(executed(QListViewItem*)),
00109 this, SLOT(addresseeExecuted(QListViewItem*)));
00110 disconnect(mListView, SIGNAL(doubleClicked(QListViewItem*)),
00111 this, SLOT(addresseeExecuted(QListViewItem*)));
00112 disconnect(mListView, SIGNAL(startAddresseeDrag()), this,
00113 SIGNAL(startDrag()));
00114 disconnect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this,
00115 SIGNAL(dropped(QDropEvent*)));
00116 delete mListView;
00117 }
00118
00119 mListView = new ContactListView( this, core()->addressBook(), viewWidget() );
00120 mListView->setFullWidth( true );
00121
00122 mListView->setShowIM( mIMProxy != 0 );
00123
00124
00125 KABC::Field::List fieldList = fields();
00126 KABC::Field::List::ConstIterator it;
00127
00128 int c = 0;
00129 for( it = fieldList.begin(); it != fieldList.end(); ++it ) {
00130 mListView->addColumn( (*it)->label() );
00131 mListView->setColumnWidthMode(c++, QListView::Manual);
00132 }
00133
00134 if ( mListView->showIM() ) {
00135
00136
00137
00138
00139 mListView->addColumn( i18n( "Presence" ) );
00140 mListView->setIMColumn( c++ );
00141 }
00142
00143 connect(mListView, SIGNAL(selectionChanged()),
00144 this, SLOT(addresseeSelected()));
00145 connect(mListView, SIGNAL(startAddresseeDrag()), this,
00146 SIGNAL(startDrag()));
00147 connect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this,
00148 SIGNAL(dropped(QDropEvent*)));
00149 connect( mListView, SIGNAL( contextMenu( KListView*, QListViewItem*, const QPoint& ) ),
00150 this, SLOT( rmbClicked( KListView*, QListViewItem*, const QPoint& ) ) );
00151 connect( mListView->header(), SIGNAL( clicked(int) ),
00152 SIGNAL( sortFieldChanged() ) );
00153
00154 if (KABPrefs::instance()->mHonorSingleClick)
00155 connect(mListView, SIGNAL(executed(QListViewItem*)),
00156 this, SLOT(addresseeExecuted(QListViewItem*)));
00157 else
00158 connect(mListView, SIGNAL(doubleClicked(QListViewItem*)),
00159 this, SLOT(addresseeExecuted(QListViewItem*)));
00160
00161 refresh();
00162
00163 mListView->setSorting( 0, true );
00164 mainLayout->addWidget( mListView );
00165 mainLayout->activate();
00166 mListView->show();
00167 }
00168
00169 KABC::Field *KAddressBookTableView::sortField() const
00170 {
00171
00172 return ( mListView->sortColumn() == -1 ? fields()[ 0 ] : fields()[ mListView->sortColumn() ] );
00173 }
00174
00175 void KAddressBookTableView::writeConfig(KConfig *config)
00176 {
00177 KAddressBookView::writeConfig(config);
00178
00179 mListView->saveLayout(config, config->group());
00180 }
00181
00182 void KAddressBookTableView::readConfig(KConfig *config)
00183 {
00184 KAddressBookView::readConfig( config );
00185
00186 if ( config->readBoolEntry( "InstantMessagingPresence", false ) ) {
00187 if ( !mIMProxy )
00188 {
00189 mIMProxy = KIMProxy::instance( kapp->dcopClient() );
00190 connect( mIMProxy, SIGNAL( sigContactPresenceChanged( const QString & ) ),
00191 this, SLOT( updatePresence( const QString & ) ) );
00192 }
00193 }
00194 else {
00195 if ( mIMProxy )
00196 {
00197 disconnect( mIMProxy, SIGNAL( sigContactPresenceChanged( const QString & ) ),
00198 this, SLOT( updatePresence( const QString & ) ) );
00199 mIMProxy = 0;
00200 }
00201 }
00202
00203
00204
00205 reconstructListView();
00206
00207
00208 mListView->setAlternateBackgroundEnabled(config->readBoolEntry("ABackground",
00209 true));
00210 mListView->setSingleLineEnabled(config->readBoolEntry("SingleLine", false));
00211 mListView->setToolTipsEnabled(config->readBoolEntry("ToolTips", true));
00212
00213 if (config->readBoolEntry("Background", false))
00214 mListView->setBackgroundPixmap(config->readPathEntry("BackgroundName"));
00215
00216
00217 mListView->restoreLayout(config, config->group());
00218 }
00219
00220 void KAddressBookTableView::refresh(QString uid)
00221 {
00222 if (uid.isNull()) {
00223
00224 QString currentUID, nextUID;
00225 ContactListViewItem *currentItem = dynamic_cast<ContactListViewItem*>( mListView->currentItem() );
00226 if ( currentItem ) {
00227 ContactListViewItem *nextItem = dynamic_cast<ContactListViewItem*>( currentItem->itemBelow() );
00228 if ( nextItem )
00229 nextUID = nextItem->addressee().uid();
00230 currentUID = currentItem->addressee().uid();
00231 }
00232
00233 mListView->clear();
00234
00235 currentItem = 0;
00236 KABC::Addressee::List addresseeList = addressees();
00237 KABC::Addressee::List::Iterator it;
00238 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
00239 ContactListViewItem *item = new ContactListViewItem(*it, mListView,
00240 core()->addressBook(), fields(), mIMProxy );
00241 if ( (*it).uid() == currentUID )
00242 currentItem = item;
00243 else if ( (*it).uid() == nextUID && !currentItem )
00244 currentItem = item;
00245 }
00246
00247
00248
00249 mListView->repaint();
00250
00251 if ( currentItem ) {
00252 mListView->setCurrentItem( currentItem );
00253 mListView->ensureItemVisible( currentItem );
00254 }
00255 } else {
00256
00257 ContactListViewItem *ceItem;
00258 QPtrList<QListViewItem> selectedItems( mListView->selectedItems() );
00259 QListViewItem *it;
00260 for ( it = selectedItems.first(); it; it = selectedItems.next() ) {
00261 ceItem = dynamic_cast<ContactListViewItem*>( it );
00262 if ( ceItem && ceItem->addressee().uid() == uid ) {
00263 ceItem->refresh();
00264 return;
00265 }
00266 }
00267 refresh( QString::null );
00268 }
00269 }
00270
00271 QStringList KAddressBookTableView::selectedUids()
00272 {
00273 QStringList uidList;
00274 QListViewItem *item;
00275 ContactListViewItem *ceItem;
00276
00277 for(item = mListView->firstChild(); item; item = item->itemBelow())
00278 {
00279 if (mListView->isSelected( item ))
00280 {
00281 ceItem = dynamic_cast<ContactListViewItem*>(item);
00282 if (ceItem != 0L)
00283 uidList << ceItem->addressee().uid();
00284 }
00285 }
00286
00287 return uidList;
00288 }
00289
00290 void KAddressBookTableView::setSelected(QString uid, bool selected)
00291 {
00292 QListViewItem *item;
00293 ContactListViewItem *ceItem;
00294
00295 if (uid.isNull())
00296 {
00297 mListView->selectAll(selected);
00298 }
00299 else
00300 {
00301 for(item = mListView->firstChild(); item; item = item->itemBelow())
00302 {
00303 ceItem = dynamic_cast<ContactListViewItem*>(item);
00304 if ((ceItem != 0L) && (ceItem->addressee().uid() == uid))
00305 {
00306 mListView->setSelected(item, selected);
00307
00308 if (selected)
00309 mListView->ensureItemVisible(item);
00310 }
00311 }
00312 }
00313 }
00314
00315 void KAddressBookTableView::addresseeSelected()
00316 {
00317
00318
00319
00320
00321 QListViewItem *item;
00322 bool found =false;
00323 for (item = mListView->firstChild(); item && !found;
00324 item = item->nextSibling())
00325 {
00326 if (item->isSelected())
00327 {
00328 found = true;
00329 ContactListViewItem *ceItem
00330 = dynamic_cast<ContactListViewItem*>(item);
00331 if ( ceItem ) emit selected(ceItem->addressee().uid());
00332 }
00333 }
00334
00335 if (!found)
00336 emit selected(QString::null);
00337 }
00338
00339 void KAddressBookTableView::addresseeExecuted(QListViewItem *item)
00340 {
00341 if (item)
00342 {
00343 ContactListViewItem *ceItem
00344 = dynamic_cast<ContactListViewItem*>(item);
00345
00346 if (ceItem)
00347 {
00348 emit executed(ceItem->addressee().uid());
00349 }
00350 }
00351 else
00352 {
00353 emit executed(QString::null);
00354 }
00355 }
00356
00357 void KAddressBookTableView::rmbClicked( KListView*, QListViewItem*, const QPoint &point )
00358 {
00359 popup( point );
00360 }
00361
00362 void KAddressBookTableView::updatePresence( const QString &uid )
00363 {
00364
00365 QListViewItem *item;
00366 ContactListViewItem *ceItem;
00367 for ( item = mListView->firstChild(); item; item = item->itemBelow() ) {
00368 ceItem = dynamic_cast<ContactListViewItem*>(item);
00369 if ( ( ceItem != 0L ) && ( ceItem->addressee().uid() == uid ) ) {
00370 ceItem->setHasIM( true );
00371 ceItem->refresh();
00372 break;
00373 }
00374 }
00375 if ( mListView->sortColumn() == mListView->imColumn() )
00376 mListView->sort();
00377 }
00378
00379 #include "kaddressbooktableview.moc"