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"