00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #define INCLUDE_MENUITEM_DEF
00025 #include <qpopupmenu.h>
00026 #include <qlayout.h>
00027 #include <qpushbutton.h>
00028
00029 #include "klanguagebutton.h"
00030 #include "klanguagebutton.moc"
00031
00032 #include <kdebug.h>
00033
00034 static void checkInsertPos( QPopupMenu *popup, const QString & str,
00035 int &index )
00036 {
00037 if ( index == -1 )
00038 return;
00039
00040 int a = 0;
00041 int b = popup->count();
00042 while ( a < b )
00043 {
00044 int w = ( a + b ) / 2;
00045
00046 int id = popup->idAt( w );
00047 int j = str.localeAwareCompare( popup->text( id ) );
00048
00049 if ( j > 0 )
00050 a = w + 1;
00051 else
00052 b = w;
00053 }
00054
00055 index = a;
00056
00057 Q_ASSERT( a == b );
00058 }
00059
00060 static QPopupMenu * checkInsertIndex( QPopupMenu *popup,
00061 const QStringList *tags, const QString &submenu )
00062 {
00063 int pos = tags->findIndex( submenu );
00064
00065 QPopupMenu *pi = 0;
00066 if ( pos != -1 )
00067 {
00068 QMenuItem *p = popup->findItem( pos );
00069 pi = p ? p->popup() : 0;
00070 }
00071 if ( !pi )
00072 pi = popup;
00073
00074 return pi;
00075 }
00076
00077 class KLanguageButtonPrivate
00078 {
00079 public:
00080 QPushButton * button;
00081 bool staticText;
00082 };
00083
00084 KLanguageButton::KLanguageButton( QWidget * parent, const char *name )
00085 : QWidget( parent, name )
00086 {
00087 init(name);
00088 }
00089
00090 KLanguageButton::KLanguageButton( const QString & text, QWidget * parent, const char *name )
00091 : QWidget( parent, name )
00092 {
00093 init(name);
00094
00095 setText(text);
00096 }
00097
00098 void KLanguageButton::setText(const QString & text)
00099 {
00100 d->staticText = true;
00101 d->button->setText(text);
00102 d->button->setIconSet(QIconSet());
00103 }
00104
00105 void KLanguageButton::init(const char * name)
00106 {
00107 m_current = 0;
00108 m_ids = new QStringList;
00109 m_popup = 0;
00110 m_oldPopup = 0;
00111 d = new KLanguageButtonPrivate;
00112
00113 d->staticText = false;
00114
00115 QHBoxLayout *layout = new QHBoxLayout(this, 0, 0);
00116 layout->setAutoAdd(true);
00117 d->button = new QPushButton( this, name );
00118
00119 clear();
00120 }
00121
00122 KLanguageButton::~KLanguageButton()
00123 {
00124 delete m_ids;
00125
00126 delete d->button;
00127 delete d;
00128 }
00129
00130
00131 void KLanguageButton::insertLanguage( const QString& path, const QString& name,
00132 const QString&, const QString &submenu, int index )
00133 {
00134 QString output = name + QString::fromLatin1( " (" ) + path +
00135 QString::fromLatin1( ")" );
00136 #if 0
00137
00138 QPixmap flag( locate( "locale", sub + path +
00139 QString::fromLatin1( "/flag.png" ) ) );
00140 #endif
00141 insertItem( output, path, submenu, index );
00142 }
00143
00144 void KLanguageButton::insertItem( const QIconSet& icon, const QString &text,
00145 const QString & id, const QString &submenu, int index )
00146 {
00147 QPopupMenu *pi = checkInsertIndex( m_popup, m_ids, submenu );
00148 checkInsertPos( pi, text, index );
00149 pi->insertItem( icon, text, count(), index );
00150 m_ids->append( id );
00151 }
00152
00153 void KLanguageButton::insertItem( const QString &text, const QString & id,
00154 const QString &submenu, int index )
00155 {
00156 insertItem( QIconSet(), text, id, submenu, index );
00157 }
00158
00159 void KLanguageButton::insertSeparator( const QString &submenu, int index )
00160 {
00161 QPopupMenu *pi = checkInsertIndex( m_popup, m_ids, submenu );
00162 pi->insertSeparator( index );
00163 m_ids->append( QString::null );
00164 }
00165
00166 void KLanguageButton::insertSubmenu( const QIconSet & icon,
00167 const QString &text, const QString &id,
00168 const QString &submenu, int index )
00169 {
00170 QPopupMenu *pi = checkInsertIndex( m_popup, m_ids, submenu );
00171 QPopupMenu *p = new QPopupMenu( pi );
00172 checkInsertPos( pi, text, index );
00173 pi->insertItem( icon, text, p, count(), index );
00174 m_ids->append( id );
00175 connect( p, SIGNAL( activated( int ) ),
00176 SLOT( slotActivated( int ) ) );
00177 connect( p, SIGNAL( highlighted( int ) ), this,
00178 SLOT( slotHighlighted( int ) ) );
00179 }
00180
00181 void KLanguageButton::insertSubmenu( const QString &text, const QString &id,
00182 const QString &submenu, int index )
00183 {
00184 insertSubmenu(QIconSet(), text, id, submenu, index);
00185 }
00186
00187 void KLanguageButton::slotActivated( int index )
00188 {
00189
00190
00191 setCurrentItem( index );
00192
00193
00194 QString id = *m_ids->at( index );
00195 emit activated( id );
00196 }
00197
00198 void KLanguageButton::slotHighlighted( int index )
00199 {
00200
00201
00202 QString id = *m_ids->at( index );
00203 emit ( highlighted(id) );
00204 }
00205
00206 int KLanguageButton::count() const
00207 {
00208 return m_ids->count();
00209 }
00210
00211 void KLanguageButton::clear()
00212 {
00213 m_ids->clear();
00214
00215 delete m_oldPopup;
00216 m_oldPopup = m_popup;
00217 m_popup = new QPopupMenu( this );
00218
00219 d->button->setPopup( m_popup );
00220
00221 connect( m_popup, SIGNAL( activated( int ) ),
00222 SLOT( slotActivated( int ) ) );
00223 connect( m_popup, SIGNAL( highlighted( int ) ),
00224 SLOT( slotHighlighted( int ) ) );
00225
00226 if ( !d->staticText )
00227 {
00228 d->button->setText( QString::null );
00229 d->button->setIconSet( QIconSet() );
00230 }
00231 }
00232
00233 bool KLanguageButton::contains( const QString & id ) const
00234 {
00235 return m_ids->contains( id ) > 0;
00236 }
00237
00238 QString KLanguageButton::current() const
00239 {
00240 return *m_ids->at( currentItem() );
00241 }
00242
00243
00244 QString KLanguageButton::id( int i ) const
00245 {
00246 if ( i < 0 || i >= count() )
00247 {
00248 kdDebug() << "KLanguageButton::tag(), unknown tag " << i << endl;
00249 return QString::null;
00250 }
00251 return *m_ids->at( i );
00252 }
00253
00254
00255 int KLanguageButton::currentItem() const
00256 {
00257 return m_current;
00258 }
00259
00260 void KLanguageButton::setCurrentItem( int i )
00261 {
00262 if ( i < 0 || i >= count() )
00263 return;
00264 m_current = i;
00265
00266 if ( !d->staticText )
00267 {
00268 d->button->setText( m_popup->text( m_current ) );
00269 QIconSet *icon = m_popup->iconSet( m_current );
00270 if ( icon )
00271 d->button->setIconSet( *icon );
00272 else
00273 d->button->setIconSet( QIconSet() );
00274 }
00275 }
00276
00277 void KLanguageButton::setCurrentItem( const QString & id )
00278 {
00279 int i = m_ids->findIndex( id );
00280 if ( id.isNull() )
00281 i = 0;
00282 if ( i != -1 )
00283 setCurrentItem( i );
00284 }