1 // File: QtxListBox.cxx
2 // Author: Sergey TELKOV
4 #include "QtxListBox.h"
9 QtxListBox::QtxListBox( QWidget* parent, const char* name, WFlags f )
10 : QListBox( parent, name, f ),
14 myEditDefault( true ),
15 myModifEnabled( true )
17 connect( this, SIGNAL( contentsMoving( int, int ) ),
18 this, SLOT( onContentsMoving( int, int ) ) );
21 QtxListBox::~QtxListBox()
25 bool QtxListBox::isEditEnabled() const
30 void QtxListBox::setEditEnabled( bool on )
32 if ( isEditEnabled() == on )
37 if ( !isEditEnabled() )
38 endEdition( defaultEditAction() );
41 bool QtxListBox::defaultEditAction() const
46 void QtxListBox::setDefaultEditAction( bool def )
51 bool QtxListBox::isModificationEnabled() const
53 return myModifEnabled;
56 void QtxListBox::setModificationEnabled( bool on )
61 QListBoxItem* QtxListBox::editedItem() const
63 return item( editedIndex() );
66 int QtxListBox::editedIndex() const
71 void QtxListBox::startEdition( const int idx )
73 if ( idx < 0 || editedIndex() == idx || !isEditEnabled() )
76 QLineEdit* ed = editor();
80 endEdition( defaultEditAction() );
84 ensureItemVisible( myEditIndex );
86 ed->setText( text( myEditIndex ) );
93 void QtxListBox::startEdition( const QListBoxItem* item )
95 startEdition( index( item ) );
98 void QtxListBox::endEdition( const bool action )
100 int idx = editedIndex();
101 QLineEdit* ed = editor();
103 if ( idx < 0 || !ed )
112 int cur = currentItem();
115 changeItem( *pixmap( idx ), ed->text(), idx );
117 changeItem( ed->text(), idx );
119 setCurrentItem( cur );
121 emit itemEdited( idx );
122 emit itemEdited( item( idx ) );
126 void QtxListBox::ensureItemVisible( const int idx )
131 if ( itemVisible( idx ) )
137 void QtxListBox::ensureItemVisible( const QListBoxItem* item )
139 ensureItemVisible( index( item ) );
142 const QValidator* QtxListBox::validator() const
144 const QValidator* v = 0;
146 v = editor()->validator();
150 void QtxListBox::clearValidator()
153 editor()->clearValidator();
156 void QtxListBox::setValidator( const QValidator* v )
159 editor()->setValidator( v );
162 void QtxListBox::moveItemToTop( const int idx )
164 moveItem( idx, -idx );
167 void QtxListBox::moveItemToBottom( const int idx )
169 moveItem( idx, count() - idx );
172 void QtxListBox::moveItem( const int idx, const int step )
174 QListBoxItem* i = item( idx );
175 if ( !i || step == 0 )
178 QListBoxItem* cur = item( currentItem() );
181 insertItem( i, QMAX( 0, idx + step ) );
183 setCurrentItem( index( cur ) );
185 int pos = index( i );
186 if ( myEditIndex == idx )
192 emit itemMoved( idx, pos );
195 void QtxListBox::createItem( const int i )
197 if ( !isEditEnabled() )
200 int idx = i < 0 ? currentItem() : i;
201 idx = idx < 0 ? count() : idx;
202 idx = QMIN( (int)count(), idx );
204 insertItem( "", idx );
205 setCurrentItem( idx );
209 void QtxListBox::deleteItem( const int i )
211 if ( !isEditEnabled() )
214 int idx = i < 0 ? currentItem() : i;
218 if ( editedIndex() == idx )
219 endEdition( defaultEditAction() );
225 void QtxListBox::setContentsPos( int x, int y )
227 QListBox::setContentsPos( x, y );
232 bool QtxListBox::eventFilter( QObject* o, QEvent* e )
236 if ( e->type() == QEvent::FocusOut )
237 endEdition( defaultEditAction() );
239 if ( e->type() == QEvent::KeyPress )
241 QKeyEvent* ke = (QKeyEvent*)e;
242 if ( ke->key() == Key_Escape )
244 else if ( ke->key() == Key_Enter || ke->key() == Key_Return )
249 return QListBox::eventFilter( o, e );
252 void QtxListBox::keyPressEvent( QKeyEvent* e )
254 if ( e->key() == Key_Up && e->state() & ControlButton && isModificationEnabled() )
255 moveItem( currentItem(), -1 );
256 else if ( e->key() == Key_Down && e->state() & ControlButton && isModificationEnabled() )
257 moveItem( currentItem(), 1 );
258 else if ( e->key() == Key_Home && e->state() & ControlButton && isModificationEnabled() )
259 moveItemToTop( currentItem() );
260 else if ( e->key() == Key_End && e->state() & ControlButton && isModificationEnabled() )
261 moveItemToBottom( currentItem() );
262 else if ( e->key() == Key_Insert && e->state() & ControlButton )
263 createItem( currentItem() );
264 else if ( e->key() == Key_Delete && e->state() & ControlButton )
265 deleteItem( currentItem() );
267 QListBox::keyPressEvent( e );
270 void QtxListBox::viewportResizeEvent( QResizeEvent* e )
272 QListBox::viewportResizeEvent( e );
277 void QtxListBox::mouseDoubleClickEvent( QMouseEvent* e )
279 if ( isEditEnabled() )
280 startEdition( itemAt( e->pos() ) );
282 QListBox::mouseDoubleClickEvent( e );
285 void QtxListBox::onContentsMoving( int, int )
290 QLineEdit* QtxListBox::editor() const
294 QtxListBox* that = (QtxListBox*)this;
295 that->createEditor();
300 void QtxListBox::createEditor()
305 myEditor = new QLineEdit( viewport() );
307 myEditor->setLineWidth( 1 );
308 myEditor->setMidLineWidth( 0 );
309 myEditor->setFrameStyle( QFrame::Box | QFrame::Plain );
310 myEditor->installEventFilter( this );
314 addChild( myEditor );
317 void QtxListBox::updateEditor()
319 if ( !editedItem() || !editor() )
322 QRect r = itemRect( editedItem() );
326 int m = editor()->lineWidth();
327 r.addCoords( m, 0, 0, 0 );
329 const QPixmap* pix = pixmap( editedIndex() );
331 r.addCoords( pix->width() + 2, 0, 0, 0 );
333 editor()->setGeometry( r );