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