kdeui Library API Documentation

klanguagebutton.cpp

00001 /* 00002 * klanguagebutton.cpp - Adds some methods for inserting languages. 00003 * 00004 * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org> 00005 * 00006 * Requires the Qt widget libraries, available at no cost at 00007 * http://www.trolltech.com/ 00008 * 00009 * This program is free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software 00021 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 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; // it doesn't really matter ... a == b here. 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()); // remove the icon 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 ); // HPB don't touch this!! 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 // Nooooo ! Country != language 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 //kdDebug() << "slotActivated" << index << endl; 00190 00191 setCurrentItem( index ); 00192 00193 // Forward event from popup menu as if it was emitted from this widget: 00194 QString id = *m_ids->at( index ); 00195 emit activated( id ); 00196 } 00197 00198 void KLanguageButton::slotHighlighted( int index ) 00199 { 00200 //kdDebug() << "slotHighlighted" << index << endl; 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 }
KDE Logo
This file is part of the documentation for kdeui Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 22:56:27 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003