00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <qptrlist.h>
00023
#include <qwidgetstack.h>
00024
#include <qsignal.h>
00025
#include <qobjectlist.h>
00026
#include <qlabel.h>
00027
#include <qpainter.h>
00028
#include <qbitmap.h>
00029
#include <qfontmetrics.h>
00030
#include <qsignalmapper.h>
00031
#include <qstyle.h>
00032
#include <qframe.h>
00033
#include <qdrawutil.h>
00034
00035
#include <kapplication.h>
00036
#include <kconfig.h>
00037
#include <klocale.h>
00038
#include <kiconloader.h>
00039
#include <sidebarextension.h>
00040
00041
#include <kdebug.h>
00042
00043
#include "mainwindow.h"
00044
00045
#include "plugin.h"
00046
00047
#include "iconsidepane.h"
00048
00049
using namespace Kontact;
00050
00051 EntryItem::EntryItem(
QListBox *parent,
Kontact::Plugin *plugin )
00052 :
QListBoxItem( parent ),
00053 mPlugin( plugin )
00054 {
00055 mPixmap = KGlobal::iconLoader()->loadIcon( plugin->
icon(),
00056 KIcon::Desktop, 48 );
00057 setCustomHighlighting(
true );
00058 setText( plugin->
title() );
00059 }
00060
00061 EntryItem::~EntryItem()
00062 {
00063 }
00064
00065 int EntryItem::width(
const QListBox *listbox)
const
00066
{
00067
int w;
00068
if ( text().isEmpty() )
00069 w = mPixmap.width();
00070
else
00071 w = QMAX( mPixmap.width(), listbox->fontMetrics().width( text() ) );
00072
00073
return w + 18;
00074 }
00075
00076 int EntryItem::height(
const QListBox *listbox)
const
00077
{
00078
int h;
00079
if ( text().isEmpty() )
00080 h = mPixmap.height();
00081
else
00082 h = mPixmap.height() + listbox->fontMetrics().lineSpacing();
00083
00084
return h + 4;
00085 }
00086
00087
void EntryItem::paint(
QPainter *p )
00088 {
00089
QListBox *box = listBox();
00090
int w = box->viewport()->width();
00091
int y = 2;
00092
00093
if ( !mPixmap.isNull() ) {
00094
int x = ( w - mPixmap.width() ) / 2;
00095 p->drawPixmap( x, y, mPixmap );
00096 }
00097
00098
QColor save;
00099
if ( isCurrent() || isSelected() ) {
00100 save = p->pen().color();
00101 p->setPen(listBox()->colorGroup().brightText());
00102 }
00103
00104
if ( !text().isEmpty() ) {
00105
QFontMetrics fm = p->fontMetrics();
00106 y += mPixmap.height() + fm.height() - fm.descent();
00107
int x = ( w - fm.width( text() ) ) / 2;
00108 p->drawText( x, y, text() );
00109 }
00110
00111
if ( isCurrent() || isSelected() ) {
00112 p->setPen(save);
00113
QColorGroup group = box->colorGroup();
00114 group.setColor( QColorGroup::Dark, Qt::black );
00115 qDrawShadePanel( p, 1, 0, w - 2,
height( box ),
00116 group,
true, 1, 0 );
00117 }
00118 }
00119
00120 Navigator::Navigator( SidePaneBase *parent,
const char *name)
00121 : KListBox( parent, name ), mSidePane( parent )
00122 {
00123 setSelectionMode( KListBox::Single );
00124 viewport()->setBackgroundMode( PaletteMid );
00125 setHScrollBarMode( QScrollView::AlwaysOff );
00126 setAcceptDrops(
true );
00127
00128 connect(
this, SIGNAL( currentChanged(
QListBoxItem * ) ),
00129 SLOT( slotExecuted(
QListBoxItem * ) ) );
00130
00131 mMapper =
new QSignalMapper(
this );
00132 connect( mMapper, SIGNAL( mapped(
int ) ), SLOT( shortCutSelected(
int ) ) );
00133 }
00134
00135
QSize Navigator::sizeHint()
const
00136
{
00137
return QSize( 100, 100 );
00138 }
00139
00140
void Navigator::setSelected(
QListBoxItem *i,
bool sel )
00141 {
00142
00143
00144
00145
if (sel) {
00146
EntryItem *entry = static_cast<EntryItem *>( i );
00147 emit pluginActivated( entry->
plugin() );
00148 }
00149 }
00150
00151
void Navigator::updatePlugins(
QValueList<Kontact::Plugin*> plugins )
00152 {
00153 clear();
00154
00155 mActions.setAutoDelete(
true );
00156 mActions.clear();
00157 mActions.setAutoDelete(
false );
00158
00159
int counter = 0;
00160
int minWidth = 0;
00161
QValueList<Kontact::Plugin*>::ConstIterator end = plugins.end();
00162
QValueList<Kontact::Plugin*>::ConstIterator it = plugins.begin();
00163
for ( ; it != end; ++it ) {
00164
Kontact::Plugin *plugin = *it;
00165
if ( !plugin->
showInSideBar() )
00166
continue;
00167
00168
EntryItem *item =
new EntryItem(
this, plugin );
00169
00170
if ( item->
width(
this ) > minWidth )
00171 minWidth = item->
width(
this );
00172
00173
QString name =
QString(
"CTRL+%1" ).arg( counter + 1 );
00174 KAction *action =
new KAction( plugin->
title(), KShortcut( name ),
00175 mMapper, SLOT( map() ),
00176 mSidePane->actionCollection(), name.latin1() );
00177 mMapper->setMapping( action, counter );
00178 counter++;
00179 }
00180
00181 parentWidget()->setFixedWidth( minWidth );
00182 }
00183
00184
void Navigator::slotExecuted(
QListBoxItem *item )
00185 {
00186
if ( !item )
return;
00187
00188
EntryItem *entry = static_cast<EntryItem *>( item );
00189
00190 emit pluginActivated( entry->
plugin() );
00191 }
00192
00193
void Navigator::dragEnterEvent(
QDragEnterEvent *event )
00194 {
00195 kdDebug(5600) <<
"Navigator::dragEnterEvent()" << endl;
00196
00197 dragMoveEvent( event );
00198 }
00199
00200
void Navigator::dragMoveEvent(
QDragMoveEvent *event )
00201 {
00202 kdDebug(5600) <<
"Navigator::dragEnterEvent()" << endl;
00203
00204 kdDebug(5600) <<
" Format: " << event->format() << endl;
00205
00206
QListBoxItem *item = itemAt( event->pos() );
00207
00208
if ( !item ) {
00209 event->accept(
false );
00210
return;
00211 }
00212
00213
EntryItem *entry = static_cast<EntryItem *>( item );
00214
00215 kdDebug(5600) <<
" PLUGIN: " << entry->
plugin()->
identifier() << endl;
00216
00217 event->accept( entry->
plugin()->
canDecodeDrag( event ) );
00218 }
00219
00220
void Navigator::dropEvent(
QDropEvent *event )
00221 {
00222 kdDebug(5600) <<
"Navigator::dropEvent()" << endl;
00223
00224
QListBoxItem *item = itemAt( event->pos() );
00225
00226
if ( !item ) {
00227
return;
00228 }
00229
00230
EntryItem *entry = static_cast<EntryItem *>( item );
00231
00232 kdDebug(5600) <<
" PLUGIN: " << entry->
plugin()->
identifier() << endl;
00233
00234 entry->
plugin()->
processDropEvent( event );
00235 }
00236
00237
void Navigator::resizeEvent(
QResizeEvent *event )
00238 {
00239 QListBox::resizeEvent( event );
00240 triggerUpdate(
true );
00241 }
00242
00243
void Navigator::shortCutSelected(
int pos )
00244 {
00245 setCurrentItem( pos );
00246 }
00247
00248
00249 IconSidePane::IconSidePane(
Core *core,
QWidget *parent,
const char *name )
00250 : SidePaneBase( core, parent, name )
00251 {
00252 mNavigator =
new Navigator(
this );
00253 connect( mNavigator, SIGNAL( pluginActivated(
Kontact::Plugin * ) ),
00254 SIGNAL( pluginSelected(
Kontact::Plugin * ) ) );
00255
00256 setAcceptDrops(
true );
00257 }
00258
00259 IconSidePane::~IconSidePane()
00260 {
00261 }
00262
00263
void IconSidePane::updatePlugins()
00264 {
00265 mNavigator->updatePlugins( core()->pluginList() );
00266 }
00267
00268
void IconSidePane::selectPlugin(
Kontact::Plugin *plugin )
00269 {
00270
bool blocked = signalsBlocked();
00271 blockSignals(
true );
00272
00273 uint i;
00274
for ( i = 0; i < mNavigator->count(); ++i ) {
00275
EntryItem *item = static_cast<EntryItem *>( mNavigator->item( i ) );
00276
if ( item->
plugin() == plugin ) {
00277 mNavigator->setCurrentItem( i );
00278
break;
00279 }
00280 }
00281
00282 blockSignals( blocked );
00283 }
00284
00285
void IconSidePane::selectPlugin(
const QString &name )
00286 {
00287
bool blocked = signalsBlocked();
00288 blockSignals(
true );
00289
00290 uint i;
00291
for ( i = 0; i < mNavigator->count(); ++i ) {
00292
EntryItem *item = static_cast<EntryItem *>( mNavigator->item( i ) );
00293
if ( item->
plugin()->
identifier() == name ) {
00294 mNavigator->setCurrentItem( i );
00295
break;
00296 }
00297 }
00298
00299 blockSignals( blocked );
00300 }
00301
00302
#include "iconsidepane.moc"
00303
00304