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