klistbox.cpp
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"
This file is part of the documentation for kdeui Library Version 3.3.2.