00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "kapplication.h"
00022
#include "kxmlguibuilder.h"
00023
#include "kmenubar.h"
00024
#include "kpopupmenu.h"
00025
#include "ktoolbar.h"
00026
#include "kstatusbar.h"
00027
#include "kmainwindow.h"
00028
#include "kaction.h"
00029
#include "kglobalsettings.h"
00030
#include <klocale.h>
00031
#include <kiconloader.h>
00032
#include <kdebug.h>
00033
#include <qobjectlist.h>
00034
00035
class KXMLGUIBuilderPrivate
00036 {
00037
public:
00038 KXMLGUIBuilderPrivate() {
00039 }
00040 ~KXMLGUIBuilderPrivate() {
00041 }
00042
00043
QWidget *m_widget;
00044
00045
QString tagMainWindow;
00046
QString tagMenuBar;
00047
QString tagMenu;
00048
QString tagToolBar;
00049
QString tagStatusBar;
00050
00051
QString tagSeparator;
00052
QString tagTearOffHandle;
00053
QString tagMenuTitle;
00054
00055
QString attrName;
00056
QString attrLineSeparator;
00057
00058
QString attrText1;
00059
QString attrText2;
00060
QString attrContext;
00061
00062
QString attrIcon;
00063
00064
KInstance *m_instance;
00065
KXMLGUIClient *m_client;
00066 };
00067
00068 KXMLGUIBuilder::KXMLGUIBuilder(
QWidget *widget )
00069 {
00070 d =
new KXMLGUIBuilderPrivate;
00071 d->m_widget = widget;
00072
00073 d->tagMainWindow =
QString::fromLatin1(
"mainwindow" );
00074 d->tagMenuBar =
QString::fromLatin1(
"menubar" );
00075 d->tagMenu =
QString::fromLatin1(
"menu" );
00076 d->tagToolBar =
QString::fromLatin1(
"toolbar" );
00077 d->tagStatusBar =
QString::fromLatin1(
"statusbar" );
00078
00079 d->tagSeparator =
QString::fromLatin1(
"separator" );
00080 d->tagTearOffHandle =
QString::fromLatin1(
"tearoffhandle" );
00081 d->tagMenuTitle =
QString::fromLatin1(
"title" );
00082
00083 d->attrName =
QString::fromLatin1(
"name" );
00084 d->attrLineSeparator =
QString::fromLatin1(
"lineseparator" );
00085
00086 d->attrText1 =
QString::fromLatin1(
"text" );
00087 d->attrText2 =
QString::fromLatin1(
"Text" );
00088 d->attrContext =
QString::fromLatin1(
"context" );
00089
00090 d->attrIcon =
QString::fromLatin1(
"icon" );
00091
00092 d->m_instance = 0;
00093 d->m_client = 0;
00094 }
00095
00096 KXMLGUIBuilder::~KXMLGUIBuilder()
00097 {
00098
delete d;
00099 }
00100
00101
QWidget *KXMLGUIBuilder::widget()
00102 {
00103
return d->m_widget;
00104 }
00105
00106
QStringList KXMLGUIBuilder::containerTags()
const
00107
{
00108
QStringList res;
00109 res << d->tagMenu << d->tagToolBar << d->tagMainWindow << d->tagMenuBar << d->tagStatusBar;
00110
00111
return res;
00112 }
00113
00114 QWidget *
KXMLGUIBuilder::createContainer(
QWidget *parent,
int index,
const QDomElement &element,
int &
id )
00115 {
00116
id = -1;
00117
if ( element.
tagName().lower() == d->tagMainWindow )
00118 {
00119
KMainWindow *mainwindow = 0;
00120
if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00121 mainwindow = static_cast<KMainWindow *>(d->m_widget);
00122
00123
return mainwindow;
00124 }
00125
00126
if ( element.
tagName().lower() == d->tagMenuBar )
00127 {
00128
KMenuBar *bar;
00129
00130
if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00131 bar = static_cast<KMainWindow *>(d->m_widget)->menuBar();
00132
else
00133 bar =
new KMenuBar( d->m_widget );
00134
00135 bar->
show();
00136
return bar;
00137 }
00138
00139
if ( element.
tagName().lower() == d->tagMenu )
00140 {
00141
00142
00143
00144
00145
00146
00147
QWidget* p = parent;
00148
while ( p && !::qt_cast<KMainWindow *>( p ) )
00149 p = p->
parentWidget();
00150
00151
QCString name = element.
attribute( d->attrName ).utf8();
00152
00153
if (!kapp->authorizeKAction(name))
00154
return 0;
00155
00156
KPopupMenu *popup =
new KPopupMenu( p, name);
00157
00158
QString i18nText;
00159
QDomElement textElem = element.namedItem( d->attrText1 ).toElement();
00160
if ( textElem.isNull() )
00161 textElem = element.namedItem( d->attrText2 ).toElement();
00162
QCString text = textElem.
text().utf8();
00163
QCString context = textElem.
attribute(d->attrContext).utf8();
00164
00165
if ( text.
isEmpty() )
00166 i18nText = i18n(
"No text!" );
00167
else if ( context.
isEmpty() )
00168 i18nText = i18n( text );
00169
else
00170 i18nText = i18n( context, text );
00171
00172
QString icon = element.
attribute( d->attrIcon );
00173
QIconSet pix;
00174
00175
if ( !icon.
isEmpty() )
00176 {
00177
KInstance *instance = d->m_instance;
00178
if ( !instance )
00179 instance =
KGlobal::instance();
00180
00181 pix = SmallIconSet( icon, 16, instance );
00182 }
00183
00184
if ( parent && ::qt_cast<KMenuBar *>( parent ) )
00185 {
00186
if ( !icon.
isEmpty() )
00187
id = static_cast<KMenuBar *>(parent)->insertItem( pix, i18nText, popup, -1, index );
00188
else
00189
id = static_cast<KMenuBar *>(parent)->insertItem( i18nText, popup, -1, index );
00190 }
00191
else if ( parent && ::qt_cast<QPopupMenu *>( parent ) )
00192 {
00193
if ( !icon.
isEmpty() )
00194
id = static_cast<QPopupMenu *>(parent)->insertItem( pix, i18nText, popup, -1, index );
00195
else
00196
id = static_cast<QPopupMenu *>(parent)->insertItem( i18nText, popup, -1, index );
00197 }
00198
00199
return popup;
00200 }
00201
00202
if ( element.
tagName().lower() == d->tagToolBar )
00203 {
00204
bool honor = (element.
attribute( d->attrName ) ==
"mainToolBar");
00205
00206
QCString name = element.
attribute( d->attrName ).utf8();
00207
00208
KToolBar *bar = static_cast<KToolBar*>(d->m_widget->child( name,
"KToolBar" ));
00209
if( !bar )
00210 {
00211 bar =
new KToolBar( d->m_widget, name, honor,
false );
00212 }
00213
00214
if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00215 {
00216
if ( d->m_client && !d->m_client->xmlFile().isEmpty() )
00217 bar->
setXMLGUIClient( d->m_client );
00218 }
00219
00220 bar->
loadState( element );
00221
00222
return bar;
00223 }
00224
00225
if ( element.
tagName().lower() == d->tagStatusBar )
00226 {
00227
if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00228 {
00229
KMainWindow *mainWin = static_cast<KMainWindow *>(d->m_widget);
00230 mainWin->
statusBar()->show();
00231
return mainWin->
statusBar();
00232 }
00233
KStatusBar *bar =
new KStatusBar( d->m_widget );
00234
return bar;
00235 }
00236
00237
return 0L;
00238 }
00239
00240 void KXMLGUIBuilder::removeContainer(
QWidget *container,
QWidget *parent,
QDomElement &element,
int id )
00241 {
00242
00243
00244
if ( ::qt_cast<QPopupMenu *>( container ) )
00245 {
00246
if ( parent )
00247 {
00248
if ( ::qt_cast<KMenuBar *>( parent ) )
00249 static_cast<KMenuBar *>(parent)->removeItem(
id );
00250
else if ( ::qt_cast<QPopupMenu *>( parent ) )
00251 static_cast<QPopupMenu *>(parent)->removeItem(
id );
00252 }
00253
00254
delete container;
00255 }
00256
else if ( ::qt_cast<KToolBar *>( container ) )
00257 {
00258
KToolBar *tb = static_cast<KToolBar *>( container );
00259
00260 tb->
saveState( element );
00261
delete tb;
00262 }
00263
else if ( ::qt_cast<KMenuBar *>( container ) )
00264 {
00265
KMenuBar *mb = static_cast<KMenuBar *>( container );
00266 mb->
hide();
00267
00268
00269
00270
00271 }
00272
else if ( ::qt_cast<KStatusBar *>( container ) )
00273 {
00274
if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00275 container->
hide();
00276
else
00277
delete static_cast<KStatusBar *>(container);
00278 }
00279
else
00280
kdWarning() <<
"Unhandled container to remove : " << container->className() <<
endl;
00281 }
00282
00283
QStringList KXMLGUIBuilder::customTags()
const
00284
{
00285
QStringList res;
00286 res << d->tagSeparator << d->tagTearOffHandle << d->tagMenuTitle;
00287
return res;
00288 }
00289
00290
int KXMLGUIBuilder::createCustomElement(
QWidget *parent,
int index,
const QDomElement &element )
00291 {
00292
if ( element.
tagName().lower() == d->tagSeparator )
00293 {
00294
if ( ::qt_cast<QPopupMenu *>( parent ) )
00295 {
00296
00297
QPopupMenu *menu = static_cast<QPopupMenu *>(parent);
00298
int count = menu->count();
00299
if (count)
00300 {
00301
int previousId = -1;
00302
if ((index == -1) || (index > count))
00303 previousId = menu->
idAt(count-1);
00304
else if (index > 0)
00305 previousId = menu->
idAt(index-1);
00306
if (previousId != -1)
00307 {
00308
if (menu->
text(previousId).isEmpty() &&
00309 !menu->
iconSet(previousId) &&
00310 !menu->
pixmap(previousId))
00311
return 0;
00312 }
00313 }
00314
00315
if(count == 0)
00316
return 0;
00317
else
00318
return menu->
insertSeparator( index );
00319 }
00320
else if ( ::qt_cast<QMenuBar *>( parent ) )
00321
return static_cast<QMenuBar *>(parent)->insertSeparator( index );
00322
else if ( ::qt_cast<KToolBar *>( parent ) )
00323 {
00324
KToolBar *bar = static_cast<KToolBar *>( parent );
00325
00326
bool isLineSep =
true;
00327
00328
QDomNamedNodeMap attributes = element.
attributes();
00329
unsigned int i = 0;
00330
for (; i < attributes.
length(); i++ )
00331 {
00332
QDomAttr attr = attributes.
item( i ).toAttr();
00333
00334
if ( attr.
name().lower() == d->attrLineSeparator &&
00335 attr.
value().lower() ==
QString::fromLatin1(
"false") )
00336 {
00337 isLineSep =
false;
00338
break;
00339 }
00340 }
00341
00342
int id =
KAction::getToolButtonID();
00343
00344
if ( isLineSep )
00345 bar->
insertLineSeparator( index,
id );
00346
else
00347 bar->
insertSeparator( index,
id );
00348
00349
return id;
00350 }
00351 }
00352
else if ( element.
tagName().lower() == d->tagTearOffHandle )
00353 {
00354
if ( ::qt_cast<QPopupMenu *>( parent ) &&
KGlobalSettings::insertTearOffHandle())
00355
return static_cast<QPopupMenu *>(parent)->insertTearOffHandle( -1, index );
00356 }
00357
else if ( element.
tagName().lower() == d->tagMenuTitle )
00358 {
00359
if ( ::qt_cast<KPopupMenu *>( parent ) )
00360 {
00361
QString i18nText;
00362
QCString text = element.
text().utf8();
00363
00364
if ( text.
isEmpty() )
00365 i18nText = i18n(
"No text!" );
00366
else
00367 i18nText = i18n( text );
00368
00369
QString icon = element.
attribute( d->attrIcon );
00370
QPixmap pix;
00371
00372
if ( !icon.
isEmpty() )
00373 {
00374
KInstance *
instance = d->m_instance;
00375
if ( !
instance )
00376
instance =
KGlobal::instance();
00377
00378 pix = SmallIcon( icon, instance );
00379 }
00380
00381
if ( !icon.
isEmpty() )
00382
return static_cast<KPopupMenu *>(parent)->insertTitle( pix, i18nText, -1, index );
00383
else
00384
return static_cast<KPopupMenu *>(parent)->insertTitle( i18nText, -1, index );
00385 }
00386 }
00387
return 0;
00388 }
00389
00390
void KXMLGUIBuilder::removeCustomElement(
QWidget *parent,
int id )
00391 {
00392
if ( ::qt_cast<QPopupMenu *>( parent ) )
00393 static_cast<QPopupMenu *>(parent)->removeItem(
id );
00394
else if ( ::qt_cast<QMenuBar *>( parent ) )
00395 static_cast<QMenuBar *>(parent)->removeItem(
id );
00396
else if ( ::qt_cast<KToolBar *>( parent ) )
00397 static_cast<KToolBar *>(parent)->removeItemDelayed(
id );
00398 }
00399
00400
KXMLGUIClient *KXMLGUIBuilder::builderClient()
const
00401
{
00402
return d->m_client;
00403 }
00404
00405
void KXMLGUIBuilder::setBuilderClient(
KXMLGUIClient *client )
00406 {
00407 d->m_client = client;
00408
if ( client )
00409 setBuilderInstance( client->
instance() );
00410 }
00411
00412
KInstance *KXMLGUIBuilder::builderInstance()
const
00413
{
00414
return d->m_instance;
00415 }
00416
00417
void KXMLGUIBuilder::setBuilderInstance(
KInstance *instance )
00418 {
00419 d->m_instance =
instance;
00420 }
00421
00422
void KXMLGUIBuilder::finalizeGUI(
KXMLGUIClient * )
00423 {
00424
if ( !d->m_widget || !::qt_cast<KMainWindow *>( d->m_widget ) )
00425
return;
00426
#if 0
00427
KToolBar *toolbar = 0;
00428
QListIterator<KToolBar> it( ( (
KMainWindow*)d->m_widget )->toolBarIterator() );
00429
while ( ( toolbar = it.current() ) ) {
00430
kdDebug() <<
"KXMLGUIBuilder::finalizeGUI toolbar=" << (
void*)toolbar <<
endl;
00431 ++it;
00432 toolbar->
positionYourself();
00433 }
00434
#else
00435
static_cast<KMainWindow *>(d->m_widget)->finalizeGUI(
false );
00436
#endif
00437
}
00438
00439
void KXMLGUIBuilder::virtual_hook(
int,
void* )
00440 { }
00441