/* kopeteonlinestatus.cpp - Kopete Online Status Copyright (c) 2002-2004 by Olivier Goffart Copyright (c) 2003 by Martijn Klingens Kopete (c) 2002-2004 by the Kopete developers ************************************************************************* * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ************************************************************************* */ #include #include #include #include #include #include "kopetecontactlistview.h" #include "kopetegroupviewitem.h" #include "kopetegroup.h" #include "kopeteonlinestatus.h" #include "kopeteprefs.h" #include "kopetemetacontactlvi.h" #include "kopetemetacontact.h" #include //using namespace Kopete::UI; class KopeteGroupViewItem::Private { public: Kopete::UI::ListView::GroupBoxComponent *hbox; Kopete::UI::ListView::ImageComponent *image; Kopete::UI::ListView::TextComponent *name; Kopete::UI::ListView::TextComponent *count; std::auto_ptr toolTipSource; }; namespace Kopete { namespace UI { namespace ListView { class GroupToolTipSource : public ToolTipSource { public: GroupToolTipSource( KopeteGroupViewItem *gp ) : group( gp ) { } TQString operator()( ComponentBase *, const TQPoint &, TQRect & ) { return group->toolTip(); } private: KopeteGroupViewItem *group; }; } // END namespace ListView } // END namespace UI } // END namespace Kopete KopeteGroupViewItem::KopeteGroupViewItem( Kopete::Group *group_, TQListView *parent, const char *name ) : Kopete::UI::ListView::Item( parent, group_, name ) { m_group = group_; initLVI(); } KopeteGroupViewItem::KopeteGroupViewItem( Kopete::Group *group_, TQListViewItem *parent, const char *name ) : Kopete::UI::ListView::Item( parent, group_, name ) { m_group = group_; initLVI(); } KopeteGroupViewItem::~KopeteGroupViewItem() { delete d; } void KopeteGroupViewItem::initLVI() { d = new Private; d->toolTipSource.reset( new Kopete::UI::ListView::GroupToolTipSource( this ) ); using namespace Kopete::UI::ListView; d->hbox = new GroupBoxComponent( this, BoxComponent::Horizontal ); Component *hbox = d->hbox; //d->image = new ImageComponent( hbox ); d->name = new TextComponent( hbox ); d->count = new TextComponent( hbox ); // d->image->setToolTipSource( d->toolTipSource.get() ); d->name->setToolTipSource( d->toolTipSource.get() ); d->count->setToolTipSource( d->toolTipSource.get() ); connect( m_group, TQT_SIGNAL( displayNameChanged( Kopete::Group*, const TQString& ) ), this, TQT_SLOT( refreshDisplayName() ) ); connect( KopetePrefs::prefs(), TQT_SIGNAL( contactListAppearanceChanged() ), TQT_SLOT( slotConfigChanged() ) ); connect( kapp, TQT_SIGNAL( appearanceChanged() ), TQT_SLOT( slotConfigChanged() ) ); connect( m_group, TQT_SIGNAL( iconAppearanceChanged() ), TQT_SLOT( updateIcon() ) ); refreshDisplayName(); slotConfigChanged(); } Kopete::Group* KopeteGroupViewItem::group() const { return m_group; } TQString KopeteGroupViewItem::toolTip() const { // TODO: add icon, and some more information than that which // is already displayed in the list view item // FIXME: post-KDE-3.3, make this better i18n-able // currently it can't cause more problems than the contact list itself, at least. return "" + d->name->text() + " " + d->count->text(); } void KopeteGroupViewItem::slotConfigChanged() { if (d->hbox != NULL) d->hbox->reloadTheme(); // updateIcon(); updateVisibility(); d->name->setColor( KopetePrefs::prefs()->contactListGroupNameColor() ); d->count->setColor( KopetePrefs::prefs()->contactListGroupNameColor() ); TQFont font = listView()->font(); if ( KopetePrefs::prefs()->contactListUseCustomFonts() ) font = KopetePrefs::prefs()->contactListCustomGroupFont(); d->name->setFont( font ); d->count->setFont( font ); } void KopeteGroupViewItem::refreshDisplayName() { totalMemberCount = 0; onlineMemberCount = 0; for ( TQListViewItem *lvi = firstChild(); lvi; lvi = lvi->nextSibling() ) { if ( KopeteMetaContactLVI *kc = dynamic_cast( lvi ) ) { totalMemberCount++; if ( kc->metaContact()->isOnline() ) onlineMemberCount++; } } d->name->setText( m_group->displayName() ); d->count->setText( i18n( "(NUMBER OF ONLINE CONTACTS/NUMBER OF CONTACTS IN GROUP)", "(%1/%2)" ) .arg( TQString::number( onlineMemberCount ), TQString::number( totalMemberCount ) ) ); updateVisibility(); // Sorting in this slot is extremely expensive as it's called dozens of times and // the sorting itself is rather slow. Therefore we call delayedSort, which tries // to group multiple sort requests into one. if ( Kopete::UI::ListView::ListView *lv = dynamic_cast( listView() ) ) lv->delayedSort(); else listView()->sort(); } TQString KopeteGroupViewItem::key( int, bool ) const { //Groups are placed after topLevel contact. //Exepted Temporary group which is the first group if ( group()->type() != Kopete::Group::Normal ) return "0" + d->name->text(); return "M" + d->name->text(); } void KopeteGroupViewItem::startRename( int /*col*/ ) { //kdDebug(14000) << k_funcinfo << endl; TDEListViewItem::startRename( 0 ); } void KopeteGroupViewItem::okRename( int col ) { //kdDebug(14000) << k_funcinfo << endl; TDEListViewItem::okRename(col); setRenameEnabled( 0, false ); } void KopeteGroupViewItem::cancelRename( int col ) { //kdDebug(14000) << k_funcinfo << endl; TDEListViewItem::cancelRename(col); setRenameEnabled( 0, false ); } void KopeteGroupViewItem::updateVisibility() { //FIXME: A contact can ve visible if he has a unknwon status (it's not online) // or if he has an event (blinking icon). If such as contact is not with // others inline contact in the group. the group will stay hidden. int visibleUsers = onlineMemberCount; if ( KopetePrefs::prefs()->showOffline() ) visibleUsers = totalMemberCount; bool visible = KopetePrefs::prefs()->showEmptyGroups() || ( visibleUsers > 0 ); if ( isVisible() != visible ) { setTargetVisibility( visible ); if ( visible ) { // When calling setVisible(true) EVERY child item will be shown, // even if they should be hidden. // We just re-update the visibility of all child items for ( TQListViewItem *lvi = firstChild(); lvi; lvi = lvi->nextSibling() ) { if ( KopeteMetaContactLVI *kmc = dynamic_cast( lvi ) ) kmc->updateVisibility(); } } } } void KopeteGroupViewItem::updateIcon() { // TODO: clever caching if ( isOpen() ) { if ( group()->useCustomIcon() && !group()->icon( Kopete::ContactListElement::Open ).isEmpty() ) open = SmallIcon( group()->icon( Kopete::ContactListElement::Open ) ); else open = SmallIcon( KOPETE_GROUP_DEFAULT_OPEN_ICON ); // d->image->setPixmap( open ); } else { if ( group()->useCustomIcon() && !group()->icon( Kopete::ContactListElement::Closed ).isEmpty() ) closed = SmallIcon( group()->icon( Kopete::ContactListElement::Closed ) ); else closed = SmallIcon( KOPETE_GROUP_DEFAULT_CLOSED_ICON ); // d->image->setPixmap( closed ); } } TQString KopeteGroupViewItem::text( int column ) const { if ( column == 0 ) return d->name->text(); else return TDEListViewItem::text( column ); } void KopeteGroupViewItem::setText( int column, const TQString &text ) { if ( column == 0 ) { KopeteContactListView *lv = dynamic_cast( listView() ); if ( lv ) { KopeteContactListView::UndoItem *u=new KopeteContactListView::UndoItem(KopeteContactListView::UndoItem::GroupRename, 0L, m_group); u->args << m_group->displayName(); lv->insertUndoItem(u); } group()->setDisplayName( text ); } else TDEListViewItem::setText( column, text ); } #include "kopetegroupviewitem.moc"