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 }