00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <stdio.h>
00031
00032 #include <QCompleter>
00033 #include <QKeyEvent>
00034 #include <QLineEdit>
00035
00036 #include "rviz/properties/editable_combo_box.h"
00037
00038 namespace rviz
00039 {
00040
00041 EditableComboBox::EditableComboBox( QWidget* parent )
00042 : ComboBox( parent )
00043 {
00044 setEditable( true );
00045 completer()->setCompletionMode( QCompleter::PopupCompletion );
00046 completer()->setCaseSensitivity( Qt::CaseInsensitive );
00047 }
00048
00049 QString findMaxCommonPrefix( const QStringList& strings )
00050 {
00051 if( strings.size() == 0 )
00052 {
00053 return "";
00054 }
00055 if( strings.size() == 1 )
00056 {
00057 return strings[ 0 ];
00058 }
00059 QString common_prefix;
00060 int char_index = 0;
00061
00062
00063 while( true )
00064 {
00065 if( char_index >= strings[ 0 ].size() )
00066 {
00067 return common_prefix;
00068 }
00069 const QChar c = strings[ 0 ][ char_index ];
00070
00071
00072 for( int string_index = 1; string_index < strings.size(); string_index++ )
00073 {
00074 const QString& str = strings[ string_index ];
00075 if( char_index >= str.size() ||
00076 str[ char_index ] != c )
00077 {
00078 return common_prefix;
00079 }
00080 }
00081 common_prefix += c;
00082 char_index++;
00083 }
00084 return "";
00085 }
00086
00087 bool EditableComboBox::event( QEvent* event )
00088 {
00089 if( event->type() == QEvent::KeyPress )
00090 {
00091 QKeyEvent* k = (QKeyEvent*) event;
00092 if( k->key() == Qt::Key_Tab && k->modifiers() == Qt::NoModifier )
00093 {
00094 QCompleter* comp = completer();
00095
00096 QStringList completions;
00097 for( int i = 0; comp->setCurrentRow( i ); i++ )
00098 {
00099 completions.push_back( comp->currentCompletion() );
00100 }
00101 QString max_common_prefix = findMaxCommonPrefix( completions );
00102 if( max_common_prefix.size() > currentText().size() )
00103 {
00104 setEditText( max_common_prefix );
00105 lineEdit()->setCursorPosition( max_common_prefix.size() );
00106 }
00107
00108 event->accept();
00109 return true;
00110 }
00111 }
00112 return ComboBox::event( event );
00113 }
00114
00115 }