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 <qheader.h>
00025 #include <qiconset.h>
00026 #include <qimage.h>
00027 #include <qdragobject.h>
00028 #include <qcombobox.h>
00029 #include <qpainter.h>
00030 #include <qbrush.h>
00031 #include <qevent.h>
00032
00033 #include <klocale.h>
00034 #include <kglobalsettings.h>
00035 #include <kiconloader.h>
00036 #include <kdebug.h>
00037 #include <kconfig.h>
00038 #include <kapplication.h>
00039 #include <kurl.h>
00040 #include <kabc/addressbook.h>
00041 #include <kabc/addressee.h>
00042 #include <libkdepim/kimproxy.h>
00043
00044 #include "kaddressbooktableview.h"
00045
00046 #include "contactlistview.h"
00047
00049
00050
00051 DynamicTip::DynamicTip( ContactListView *parent)
00052 : QToolTip( parent )
00053 {
00054 }
00055
00056 void DynamicTip::maybeTip( const QPoint &pos )
00057 {
00058 if (!parentWidget()->inherits( "ContactListView" ))
00059 return;
00060
00061 ContactListView *plv = (ContactListView*)parentWidget();
00062 if (!plv->tooltips())
00063 return;
00064
00065 QPoint posVp = plv->viewport()->pos();
00066
00067 QListViewItem *lvi = plv->itemAt( pos - posVp );
00068 if (!lvi)
00069 return;
00070
00071 ContactListViewItem *plvi = dynamic_cast< ContactListViewItem* >(lvi);
00072 if (!plvi)
00073 return;
00074
00075 QString s;
00076 QRect r = plv->itemRect( lvi );
00077 r.moveBy( posVp.x(), posVp.y() );
00078
00079
00080
00081
00082 KABC::Addressee a = plvi->addressee();
00083 if (a.isEmpty())
00084 return;
00085
00086 s += i18n("label: value", "%1: %2").arg(a.formattedNameLabel())
00087 .arg(a.formattedName());
00088
00089 s += '\n';
00090 s += i18n("label: value", "%1: %2").arg(a.organizationLabel())
00091 .arg(a.organization());
00092
00093 QString notes = a.note().stripWhiteSpace();
00094 if ( !notes.isEmpty() ) {
00095 notes += '\n';
00096 s += '\n' + i18n("label: value", "%1: \n").arg(a.noteLabel());
00097 QFontMetrics fm( font() );
00098
00099
00100 int i = 0;
00101 bool doBreak = false;
00102 int linew = 0;
00103 int lastSpace = -1;
00104 int a = 0;
00105 int lastw = 0;
00106
00107 while ( i < int(notes.length()) ) {
00108 doBreak = FALSE;
00109 if ( notes[i] != '\n' )
00110 linew += fm.width( notes[i] );
00111
00112 if ( lastSpace >= a && notes[i] != '\n' )
00113 if (linew >= parentWidget()->width()) {
00114 doBreak = TRUE;
00115 if ( lastSpace > a ) {
00116 i = lastSpace;
00117 linew = lastw;
00118 }
00119 else
00120 i = QMAX( a, i-1 );
00121 }
00122
00123 if ( notes[i] == '\n' || doBreak ) {
00124 s += notes.mid( a, i - a + (doBreak?1:0) ) +"\n";
00125
00126 a = i + 1;
00127 lastSpace = a;
00128 linew = 0;
00129 }
00130
00131 if ( notes[i].isSpace() ) {
00132 lastSpace = i;
00133 lastw = linew;
00134 }
00135
00136 if ( lastSpace <= a ) {
00137 lastw = linew;
00138 }
00139
00140 ++i;
00141 }
00142 }
00143
00144 tip( r, s );
00145 }
00146
00148
00149
00150 ContactListViewItem::ContactListViewItem(const KABC::Addressee &a,
00151 ContactListView *parent,
00152 KABC::AddressBook *doc,
00153 const KABC::Field::List &fields,
00154 KIMProxy *proxy )
00155 : KListViewItem(parent), mAddressee(a), mFields( fields ),
00156 parentListView( parent ), mDocument(doc), mIMProxy( proxy )
00157 {
00158 if ( mIMProxy )
00159 mHasIM = ( !( mIMProxy->allContacts().find( mAddressee.uid() ) == mIMProxy->allContacts().end() ) );
00160 else
00161 mHasIM = false;
00162 refresh();
00163 }
00164
00165 QString ContactListViewItem::key(int column, bool ascending) const
00166 {
00167
00168 if ( column >= parentListView->columns() )
00169 return QString::null;
00170
00171 #if KDE_VERSION >= 319
00172 Q_UNUSED( ascending )
00173 if ( parentListView->showIM() ) {
00174
00175
00176 if ( column == parentListView->imColumn() ) {
00177
00178
00179
00180 QString key = QString::number( 5 - ( mIMProxy->presenceNumeric( mAddressee.uid() ) + 1 ) );
00181 return key;
00182 }
00183 else {
00184 return mFields[ column ]->sortKey( mAddressee );
00185 }
00186 }
00187 else
00188 return mFields[ column ]->sortKey( mAddressee );
00189 #else
00190 return QListViewItem::key( column, ascending ).lower();
00191 #endif
00192 }
00193
00194 void ContactListViewItem::paintCell(QPainter * p,
00195 const QColorGroup & cg,
00196 int column,
00197 int width,
00198 int align)
00199 {
00200 KListViewItem::paintCell(p, cg, column, width, align);
00201
00202 if ( !p )
00203 return;
00204
00205 if (parentListView->singleLine()) {
00206 p->setPen( parentListView->alternateColor() );
00207 p->drawLine( 0, height() - 1, width, height() - 1 );
00208 }
00209 }
00210
00211
00212 ContactListView *ContactListViewItem::parent()
00213 {
00214 return parentListView;
00215 }
00216
00217
00218 void ContactListViewItem::refresh()
00219 {
00220
00221 mAddressee = mDocument->findByUid(mAddressee.uid());
00222 if (mAddressee.isEmpty())
00223 return;
00224
00225 int i = 0;
00226 if ( mHasIM )
00227 setPixmap( parentListView->imColumn(), mIMProxy->presenceIcon( mAddressee.uid() ) );
00228
00229 KABC::Field::List::ConstIterator it;
00230 for( it = mFields.begin(); it != mFields.end(); ++it ) {
00231 if ( (*it)->label() == KABC::Addressee::birthdayLabel() ) {
00232 QDate date = mAddressee.birthday().date();
00233 if ( date.isValid() )
00234 setText( i++, KGlobal::locale()->formatDate( date, true ) );
00235 else
00236 setText( i++, "" );
00237 } else
00238 setText( i++, (*it)->value( mAddressee ) );
00239 }
00240 }
00241
00242 void ContactListViewItem::setHasIM( bool hasIM )
00243 {
00244 mHasIM = hasIM;
00245 }
00246
00248
00249
00250 ContactListView::ContactListView(KAddressBookTableView *view,
00251 KABC::AddressBook* ,
00252 QWidget *parent,
00253 const char *name )
00254 : KListView( parent, name ),
00255 pabWidget( view ),
00256 oldColumn( 0 )
00257 {
00258 mABackground = true;
00259 mSingleLine = false;
00260 mToolTips = true;
00261 mShowIM = true;
00262 mAlternateColor = KGlobalSettings::alternateBackgroundColor();
00263
00264 setAlternateBackgroundEnabled(mABackground);
00265 setAcceptDrops( true );
00266 viewport()->setAcceptDrops( true );
00267 setAllColumnsShowFocus( true );
00268 setShowSortIndicator(true);
00269 setSelectionModeExt( KListView::Extended );
00270 setDropVisualizer(false);
00271
00272 connect(this, SIGNAL(dropped(QDropEvent*)),
00273 this, SLOT(itemDropped(QDropEvent*)));
00274
00275 new DynamicTip( this );
00276 }
00277
00278 void ContactListView::paintEmptyArea( QPainter * p, const QRect & rect )
00279 {
00280 QBrush b = palette().brush(QPalette::Active, QColorGroup::Base);
00281
00282
00283 if (b.pixmap())
00284 {
00285 p->drawTiledPixmap( rect.left(), rect.top(), rect.width(), rect.height(),
00286 *(b.pixmap()),
00287 rect.left() + contentsX(),
00288 rect.top() + contentsY() );
00289 }
00290
00291 else
00292 {
00293
00294 KListView::paintEmptyArea(p, rect);
00295 }
00296 }
00297
00298 void ContactListView::contentsMousePressEvent(QMouseEvent* e)
00299 {
00300 presspos = e->pos();
00301 KListView::contentsMousePressEvent(e);
00302 }
00303
00304
00305
00306 void ContactListView::contentsMouseMoveEvent( QMouseEvent *e )
00307 {
00308 if ((e->state() & LeftButton) && (e->pos() - presspos).manhattanLength() > 4 ) {
00309 emit startAddresseeDrag();
00310 }
00311 else
00312 KListView::contentsMouseMoveEvent( e );
00313 }
00314
00315 bool ContactListView::acceptDrag(QDropEvent *e) const
00316 {
00317 return QTextDrag::canDecode(e);
00318 }
00319
00320 void ContactListView::itemDropped(QDropEvent *e)
00321 {
00322 contentsDropEvent(e);
00323 }
00324
00325 void ContactListView::contentsDropEvent( QDropEvent *e )
00326 {
00327 emit addresseeDropped(e);
00328 }
00329
00330 void ContactListView::setAlternateBackgroundEnabled(bool enabled)
00331 {
00332 mABackground = enabled;
00333
00334 if (mABackground)
00335 {
00336 setAlternateBackground(mAlternateColor);
00337 }
00338 else
00339 {
00340 setAlternateBackground(QColor());
00341 }
00342 }
00343
00344 void ContactListView::setBackgroundPixmap(const QString &filename)
00345 {
00346 if (filename.isEmpty())
00347 {
00348 unsetPalette();
00349 }
00350 else
00351 {
00352 setPaletteBackgroundPixmap(QPixmap(filename));
00353 }
00354 }
00355
00356 void ContactListView::setShowIM( bool enabled )
00357 {
00358 mShowIM = enabled;
00359 }
00360
00361 bool ContactListView::showIM()
00362 {
00363 return mShowIM;
00364 }
00365
00366 void ContactListView::setIMColumn( int column )
00367 {
00368 mInstantMsgColumn = column;
00369 }
00370
00371 int ContactListView::imColumn()
00372 {
00373 return mInstantMsgColumn;
00374 }
00375
00376 #include "contactlistview.moc"