00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
#include "config.h"
00019
00020
#include <qtimer.h>
00021
00022
#include <kglobalsettings.h>
00023
#include <kcursor.h>
00024
#include <kapplication.h>
00025
00026
#if defined Q_WS_X11 && ! defined K_WS_QTONLY
00027
#include <kipc.h>
00028
#endif
00029
00030
#include <kdebug.h>
00031
00032
#include "klistbox.h"
00033
00034 KListBox::KListBox(
QWidget *parent,
const char *name, WFlags f )
00035 :
QListBox( parent,
name, f )
00036 {
00037 connect(
this, SIGNAL( onViewport() ),
00038
this, SLOT( slotOnViewport() ) );
00039 connect(
this, SIGNAL( onItem(
QListBoxItem * ) ),
00040
this, SLOT( slotOnItem(
QListBoxItem * ) ) );
00041 slotSettingsChanged(KApplication::SETTINGS_MOUSE);
00042
if (kapp)
00043 {
00044 connect( kapp, SIGNAL( settingsChanged(
int) ), SLOT( slotSettingsChanged(
int) ) );
00045
#if defined Q_WS_X11 && ! defined K_WS_QTONLY
00046
kapp->addKipcEventMask( KIPC::SettingsChanged );
00047
#endif
00048
}
00049
00050 m_pCurrentItem = 0L;
00051
00052 m_pAutoSelect =
new QTimer(
this );
00053 connect( m_pAutoSelect, SIGNAL( timeout() ),
00054
this, SLOT( slotAutoSelect() ) );
00055 }
00056
00057
void KListBox::slotOnItem(
QListBoxItem *item )
00058 {
00059
if ( item && m_bChangeCursorOverItem && m_bUseSingle )
00060 viewport()->setCursor(
KCursor().handCursor() );
00061
00062
if ( item && (m_autoSelectDelay > -1) && m_bUseSingle ) {
00063 m_pAutoSelect->start( m_autoSelectDelay,
true );
00064 m_pCurrentItem = item;
00065 }
00066 }
00067
00068
void KListBox::slotOnViewport()
00069 {
00070
if ( m_bChangeCursorOverItem )
00071 viewport()->unsetCursor();
00072
00073 m_pAutoSelect->stop();
00074 m_pCurrentItem = 0L;
00075 }
00076
00077
00078
void KListBox::slotSettingsChanged(
int category)
00079 {
00080
if (category != KApplication::SETTINGS_MOUSE)
00081
return;
00082 m_bUseSingle =
KGlobalSettings::singleClick();
00083
00084 disconnect(
this, SIGNAL( mouseButtonClicked(
int,
QListBoxItem *,
00085
const QPoint & ) ),
00086
this, SLOT( slotMouseButtonClicked(
int,
QListBoxItem *,
00087
const QPoint & ) ) );
00088
00089
00090
00091
00092
00093
if( m_bUseSingle )
00094 {
00095 connect(
this, SIGNAL( mouseButtonClicked(
int,
QListBoxItem *,
00096
const QPoint & ) ),
00097
this, SLOT( slotMouseButtonClicked(
int,
QListBoxItem *,
00098
const QPoint & ) ) );
00099 }
00100
else
00101 {
00102
00103
00104
00105
00106 }
00107
00108 m_bChangeCursorOverItem =
KGlobalSettings::changeCursorOverIcon();
00109 m_autoSelectDelay =
KGlobalSettings::autoSelectDelay();
00110
00111
if( !m_bUseSingle || !m_bChangeCursorOverItem )
00112 viewport()->unsetCursor();
00113 }
00114
00115 void KListBox::slotAutoSelect()
00116 {
00117
00118
if( index( m_pCurrentItem ) == -1 )
00119
return;
00120
00121
00122
if( !hasFocus() )
00123 setFocus();
00124
00125
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00126
uint keybstate =
KApplication::keyboardModifiers();
00127
#endif
00128
00129
QListBoxItem* previousItem = item( currentItem() );
00130 setCurrentItem( m_pCurrentItem );
00131
00132
if( m_pCurrentItem ) {
00133
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00134
00135
if( (keybstate & KApplication::ShiftModifier) ) {
00136
#endif
00137
bool block = signalsBlocked();
00138 blockSignals(
true );
00139
00140
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00141
00142
if( !(keybstate & KApplication::ControlModifier) )
00143 clearSelection();
00144
#endif
00145
00146
bool select = !m_pCurrentItem->isSelected();
00147
bool update = viewport()->isUpdatesEnabled();
00148 viewport()->setUpdatesEnabled(
false );
00149
00150
bool down = index( previousItem ) < index( m_pCurrentItem );
00151
QListBoxItem* it = down ? previousItem : m_pCurrentItem;
00152
for (;it ; it = it->next() ) {
00153
if ( down && it == m_pCurrentItem ) {
00154 setSelected( m_pCurrentItem, select );
00155
break;
00156 }
00157
if ( !down && it == previousItem ) {
00158 setSelected( previousItem, select );
00159
break;
00160 }
00161 setSelected( it, select );
00162 }
00163
00164 blockSignals( block );
00165 viewport()->setUpdatesEnabled( update );
00166 triggerUpdate(
false );
00167
00168 emit selectionChanged();
00169
00170
if( selectionMode() == QListBox::Single )
00171 emit selectionChanged( m_pCurrentItem );
00172 }
00173
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00174
else if( (keybstate & KApplication::ControlModifier) )
00175 setSelected( m_pCurrentItem, !m_pCurrentItem->isSelected() );
00176
#endif
00177
else {
00178
bool block = signalsBlocked();
00179 blockSignals(
true );
00180
00181
if( !m_pCurrentItem->isSelected() )
00182 clearSelection();
00183
00184 blockSignals( block );
00185
00186 setSelected( m_pCurrentItem,
true );
00187 }
00188
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00189
}
00190
else
00191
kdDebug() <<
"Thatīs not supposed to happen!!!!" <<
endl;
00192
#endif
00193
}
00194
00195
void KListBox::emitExecute(
QListBoxItem *item,
const QPoint &pos )
00196 {
00197
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00198
uint keybstate =
KApplication::keyboardModifiers();
00199
#endif
00200
00201 m_pAutoSelect->stop();
00202
00203
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00204
00205
if( !( m_bUseSingle && ((keybstate & KApplication::ShiftModifier) || (keybstate & KApplication::ControlModifier)) ) ) {
00206
#endif
00207
emit
executed( item );
00208 emit
executed( item, pos );
00209
#if defined Q_WS_X11 && ! defined K_WS_QTONLY //FIXME
00210
}
00211
#endif
00212
}
00213
00214
00215
00216
00217
00218
00219
00220
00221
void KListBox::keyPressEvent(
QKeyEvent *e)
00222 {
00223
if( e->key() == Key_Escape )
00224 {
00225 e->ignore();
00226 }
00227
else if( e->key() == Key_F1 )
00228 {
00229 e->ignore();
00230 }
00231
else
00232 {
00233 QListBox::keyPressEvent(e);
00234 }
00235 }
00236
00237
void KListBox::focusOutEvent(
QFocusEvent *fe )
00238 {
00239 m_pAutoSelect->stop();
00240
00241 QListBox::focusOutEvent( fe );
00242 }
00243
00244
void KListBox::leaveEvent(
QEvent *e )
00245 {
00246 m_pAutoSelect->stop();
00247
00248 QListBox::leaveEvent( e );
00249 }
00250
00251
void KListBox::contentsMousePressEvent(
QMouseEvent *e )
00252 {
00253
if( (selectionMode() == Extended) && (e->state() & ShiftButton) && !(e->state() & ControlButton) ) {
00254
bool block = signalsBlocked();
00255 blockSignals(
true );
00256
00257 clearSelection();
00258
00259 blockSignals( block );
00260 }
00261
00262 QListBox::contentsMousePressEvent( e );
00263 }
00264
00265
void KListBox::contentsMouseDoubleClickEvent (
QMouseEvent * e )
00266 {
00267 QListBox::contentsMouseDoubleClickEvent( e );
00268
00269
QListBoxItem* item = itemAt( e->pos() );
00270
00271
if( item ) {
00272 emit
doubleClicked( item, e->globalPos() );
00273
00274
if( (e->button() == LeftButton) && !m_bUseSingle )
00275 emitExecute( item, e->globalPos() );
00276 }
00277 }
00278
00279
void KListBox::slotMouseButtonClicked(
int btn,
QListBoxItem *item,
const QPoint &pos )
00280 {
00281
if( (btn == LeftButton) && item )
00282 emitExecute( item, pos );
00283 }
00284
00285
void KListBox::virtual_hook(
int,
void* )
00286 { }
00287
00288
#include "klistbox.moc"