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