00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
#include <kedittoolbar.h>
00019
00020
#include <qdom.h>
00021
00022
#include <qlayout.h>
00023
#include <kaction.h>
00024
00025
#include <qheader.h>
00026
#include <qcombobox.h>
00027
#include <qtoolbutton.h>
00028
#include <qlabel.h>
00029
#include <qvaluelist.h>
00030
#include <qapplication.h>
00031
00032
#include <kstandarddirs.h>
00033
#include <klocale.h>
00034
#include <kicontheme.h>
00035
#include <kiconloader.h>
00036
#include <kinstance.h>
00037
#include <kxmlguifactory.h>
00038
#include <kseparator.h>
00039
#include <kconfig.h>
00040
#include <klistview.h>
00041
00042
#include <qtextstream.h>
00043
#include <qfile.h>
00044
#include <kdebug.h>
00045
00046
static void dump_xml(
const QDomDocument& doc)
00047 {
00048
QString str;
00049
QTextStream ts(&str, IO_WriteOnly);
00050 ts << doc;
00051
kdDebug() << str <<
endl;
00052 }
00053
00054
typedef QValueList<QDomElement> ToolbarList;
00055
00056
namespace
00057
{
00058
class XmlData
00059 {
00060
public:
00061
enum XmlType { Shell = 0, Part, Local, Merged };
00062 XmlData()
00063 {
00064 m_isModified =
false;
00065 }
00066
00067
QString m_xmlFile;
00068
QDomDocument m_document;
00069 XmlType m_type;
00070
bool m_isModified;
00071
00072 ToolbarList m_barList;
00073 };
00074
00075
typedef QValueList<XmlData> XmlDataList;
00076
00077
class ToolbarItem :
public QListViewItem
00078 {
00079
public:
00080 ToolbarItem(
KListView *parent,
const QString& tag,
const QString& name,
const QString& statusText)
00081 :
QListViewItem(parent),
00082 m_tag(tag),
00083 m_name(
name),
00084 m_statusText(statusText)
00085 {
00086 }
00087
00088 ToolbarItem(
KListView *parent,
QListViewItem *item,
const QString &tag,
const QString& name,
const QString& statusText)
00089 :
QListViewItem(parent, item),
00090 m_tag(tag),
00091 m_name(
name),
00092 m_statusText(statusText)
00093 {
00094 }
00095
00096
QString internalTag()
const {
return m_tag; }
00097
QString internalName()
const {
return m_name; }
00098
QString statusText()
const {
return m_statusText; }
00099
private:
00100
QString m_tag;
00101
QString m_name;
00102
QString m_statusText;
00103 };
00104 }
00105
00106
class KEditToolbarWidgetPrivate
00107 {
00108
public:
00116 KEditToolbarWidgetPrivate(
KInstance *instance,
KActionCollection* collection)
00117 : m_collection( collection )
00118 {
00119 m_instance =
instance;
00120 m_isPart =
false;
00121 m_helpArea = 0L;
00122 }
00123 ~KEditToolbarWidgetPrivate()
00124 {
00125 }
00126
00127
QString xmlFile(
const QString& xml_file)
00128 {
00129
return xml_file.
isNull() ?
QString(m_instance->instanceName()) +
"ui.rc" :
00130 xml_file;
00131 }
00132
00136
QString loadXMLFile(
const QString& _xml_file)
00137 {
00138
QString raw_xml;
00139
QString xml_file = xmlFile(_xml_file);
00140
00141
00142
if ( xml_file[0] ==
'/' )
00143 raw_xml = KXMLGUIFactory::readConfigFile(xml_file);
00144
else
00145 raw_xml = KXMLGUIFactory::readConfigFile(xml_file, m_instance);
00146
00147
return raw_xml;
00148 }
00149
00153 ToolbarList findToolbars(
QDomElement elem)
00154 {
00155
static const QString &tagToolbar =
KGlobal::staticQString(
"ToolBar" );
00156
static const QString &attrNoEdit =
KGlobal::staticQString(
"noEdit" );
00157 ToolbarList list;
00158
00159
for( ; !elem.isNull(); elem = elem.nextSibling().toElement() )
00160 {
00161
if (elem.
tagName() == tagToolbar && elem.
attribute( attrNoEdit ) !=
"true" )
00162 list.
append(elem);
00163
00164
QDomElement child = elem.firstChild().toElement();
00165 list += findToolbars(child);
00166 }
00167
00168
return list;
00169 }
00170
00171
QValueList<KAction*> m_actionList;
00172
KActionCollection* m_collection;
00173
KInstance *m_instance;
00174
00175 XmlData m_currentXmlData;
00176
QDomElement m_currentToolbarElem;
00177
00178
QString m_xmlFile;
00179
QString m_globalFile;
00180
QString m_rcFile;
00181
QDomDocument m_localDoc;
00182
bool m_isPart;
00183
00184 ToolbarList m_barList;
00185
00186
XmlDataList m_xmlFiles;
00187
00188
QLabel * m_helpArea;
00189
00190 };
00191
00192
class KEditToolbarPrivate {
00193
public:
00194
bool m_accept;
00195 };
00196
00197 KEditToolbar::KEditToolbar(
KActionCollection *collection,
const QString& file,
00198
bool global,
QWidget* parent,
const char* name)
00199 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Ok|Apply|Cancel, Ok, parent, name),
00200 m_widget(new
KEditToolbarWidget(collection, file, global, this))
00201 {
00202 init();
00203 }
00204
00205
KEditToolbar::KEditToolbar(
const QString& defaultToolbar,
KActionCollection *collection,
00206
const QString& file,
bool global,
00207
QWidget* parent,
const char* name)
00208 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Ok|Apply|Cancel, Ok, parent, name),
00209 m_widget(new
KEditToolbarWidget(defaultToolbar, collection, file, global, this))
00210 {
00211 init();
00212 }
00213
00214 KEditToolbar::KEditToolbar(
KXMLGUIFactory* factory,
QWidget* parent,
const char* name)
00215 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Ok|Apply|Cancel, Ok, parent, name),
00216 m_widget(new
KEditToolbarWidget(factory, this))
00217 {
00218 init();
00219 }
00220
00221
KEditToolbar::KEditToolbar(
const QString& defaultToolbar,
KXMLGUIFactory* factory,
00222
QWidget* parent,
const char* name)
00223 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Ok|Apply|Cancel, Ok, parent, name),
00224 m_widget(new
KEditToolbarWidget(defaultToolbar, factory, this))
00225 {
00226 init();
00227 }
00228
00229
void KEditToolbar::init()
00230 {
00231 d =
new KEditToolbarPrivate();
00232 d->m_accept =
false;
00233
00234
setMainWidget(m_widget);
00235
00236 connect(m_widget, SIGNAL(enableOk(
bool)), SLOT(
acceptOK(
bool)));
00237 connect(m_widget, SIGNAL(enableOk(
bool)), SLOT(
enableButtonApply(
bool)));
00238
enableButtonApply(
false);
00239
00240 setMinimumSize(sizeHint());
00241 }
00242
00243 KEditToolbar::~KEditToolbar()
00244 {
00245
delete d;
00246 }
00247
00248 void KEditToolbar::acceptOK(
bool b)
00249 {
00250
enableButtonOK(b);
00251 d->m_accept = b;
00252 }
00253
00254 void KEditToolbar::slotOk()
00255 {
00256
if (!d->m_accept) {
00257
reject();
00258
return;
00259 }
00260
00261
if (!m_widget->
save())
00262 {
00263
00264 }
00265
else
00266 {
00267 emit
newToolbarConfig();
00268
accept();
00269 }
00270 }
00271
00272 void KEditToolbar::slotApply()
00273 {
00274 (
void)m_widget->
save();
00275
enableButtonApply(
false);
00276 emit
newToolbarConfig();
00277 }
00278
00279 KEditToolbarWidget::KEditToolbarWidget(
KActionCollection *collection,
00280
const QString& file,
00281
bool global,
QWidget *parent)
00282 :
QWidget(parent),
00283 d(new KEditToolbarWidgetPrivate(instance(), collection))
00284 {
00285 initNonKPart(collection, file, global);
00286
00287 loadToolbarCombo();
00288
adjustSize();
00289
setMinimumSize(
sizeHint());
00290 }
00291
00292
KEditToolbarWidget::KEditToolbarWidget(
const QString& defaultToolbar,
00293
KActionCollection *collection,
00294
const QString& file,
bool global,
00295
QWidget *parent)
00296 :
QWidget(parent),
00297 d(new KEditToolbarWidgetPrivate(instance(), collection))
00298 {
00299 initNonKPart(collection, file, global);
00300
00301 loadToolbarCombo(defaultToolbar);
00302
adjustSize();
00303
setMinimumSize(
sizeHint());
00304 }
00305
00306 KEditToolbarWidget::KEditToolbarWidget(
KXMLGUIFactory* factory,
00307
QWidget *parent)
00308 :
QWidget(parent),
00309 d(new KEditToolbarWidgetPrivate(instance(),
KXMLGUIClient::actionCollection() ))
00310 {
00311 initKPart(factory);
00312
00313 loadToolbarCombo();
00314
adjustSize();
00315
setMinimumSize(
sizeHint());
00316 }
00317
00318
KEditToolbarWidget::KEditToolbarWidget(
const QString& defaultToolbar,
00319
KXMLGUIFactory* factory,
00320
QWidget *parent)
00321 :
QWidget(parent),
00322 d(new KEditToolbarWidgetPrivate(instance(),
KXMLGUIClient::actionCollection() ))
00323 {
00324 initKPart(factory);
00325
00326 loadToolbarCombo(defaultToolbar);
00327
adjustSize();
00328
setMinimumSize(
sizeHint());
00329 }
00330
00331 KEditToolbarWidget::~KEditToolbarWidget()
00332 {
00333
delete d;
00334 }
00335
00336
void KEditToolbarWidget::initNonKPart(
KActionCollection *collection,
00337
const QString& file,
bool global)
00338 {
00339
00340
00341 d->m_actionList = collection->
actions();
00342
00343
00344
if (global)
00345
setXMLFile(
locate(
"config",
"ui/ui_standards.rc"));
00346
QString localXML = d->loadXMLFile(file);
00347
setXML(localXML,
true);
00348
00349
00350
QDomElement elem;
00351
00352
00353 XmlData local;
00354 local.m_xmlFile = d->xmlFile(file);
00355 local.m_type = XmlData::Local;
00356 local.m_document.setContent(localXML);
00357 elem = local.m_document.documentElement().toElement();
00358
KXMLGUIFactory::removeDOMComments( elem );
00359 local.m_barList = d->findToolbars(elem);
00360 d->m_xmlFiles.append(local);
00361
00362
00363 XmlData merge;
00364 merge.m_xmlFile = QString::null;
00365 merge.m_type = XmlData::Merged;
00366 merge.m_document =
domDocument();
00367 elem = merge.m_document.documentElement().toElement();
00368 merge.m_barList = d->findToolbars(elem);
00369 d->m_xmlFiles.append(merge);
00370
00371
00372 setupLayout();
00373 }
00374
00375
void KEditToolbarWidget::initKPart(
KXMLGUIFactory* factory)
00376 {
00377
00378
QDomElement elem;
00379
00380
setFactory( factory );
00381
actionCollection()->
setWidget(
this );
00382
00383
00384
QPtrList<KXMLGUIClient> clients(factory->
clients());
00385
QPtrListIterator<KXMLGUIClient> it( clients );
00386
for( ; it.current(); ++it)
00387 {
00388
KXMLGUIClient *client = it.current();
00389
00390
if (client->
xmlFile().
isNull())
00391
continue;
00392
00393 XmlData data;
00394 data.m_xmlFile = client->
localXMLFile();
00395
if ( it.atFirst() )
00396 data.m_type = XmlData::Shell;
00397
else
00398 data.m_type = XmlData::Part;
00399 data.m_document.setContent( KXMLGUIFactory::readConfigFile( client->
xmlFile(), client->
instance() ) );
00400 elem = data.m_document.documentElement().toElement();
00401
KXMLGUIFactory::removeDOMComments( elem );
00402 data.m_barList = d->findToolbars(elem);
00403 d->m_xmlFiles.append(data);
00404
00405 d->m_actionList += client->
actionCollection()->
actions();
00406 }
00407
00408
00409 setupLayout();
00410 }
00411
00412 bool KEditToolbarWidget::save()
00413 {
00414
00415 XmlDataList::Iterator it = d->m_xmlFiles.begin();
00416
for ( ; it != d->m_xmlFiles.end(); ++it)
00417 {
00418
00419
if ( (*it).m_isModified ==
false )
00420
continue;
00421
00422
00423
if ( (*it).m_type == XmlData::Merged )
00424
continue;
00425
00426 dump_xml((*it).m_document);
00427
00428
00429 KXMLGUIFactory::saveConfigFile((*it).m_document, (*it).m_xmlFile);
00430 }
00431
00432
if ( !
factory() )
00433
return true;
00434
00435
QPtrList<KXMLGUIClient> clients(
factory()->clients());
00436
00437
00438
00439
KXMLGUIClient *client = clients.
last();
00440
while ( client )
00441 {
00442
00443
factory()->
removeClient( client );
00444 client = clients.
prev();
00445 }
00446
00447 client = clients.
first();
00448
KXMLGUIClient *firstClient = client;
00449
00450
00451
00452
for (; client; client = clients.
next() )
00453 {
00454
QString file( client->
xmlFile() );
00455
if ( !file.
isEmpty() )
00456 {
00457
00458 client->
setXMLGUIBuildDocument(
QDomDocument() );
00459
00460
00461
if ( client == firstClient )
00462 client->
setXMLFile(
locate(
"config",
"ui/ui_standards.rc"));
00463
00464
00465 client->
setXMLFile( file, client == firstClient );
00466 }
00467
00468
00469
00470
factory()->
addClient( client );
00471 }
00472
00473
return true;
00474 }
00475
00476
void KEditToolbarWidget::setupLayout()
00477 {
00478
00479
QLabel *toolbar_label =
new QLabel(i18n(
"&Toolbar:"),
this);
00480 m_toolbarCombo =
new QComboBox(
this);
00481 m_toolbarCombo->setEnabled(
false);
00482 toolbar_label->
setBuddy(m_toolbarCombo);
00483 connect(m_toolbarCombo, SIGNAL(activated(
const QString&)),
00484
this, SLOT(slotToolbarSelected(
const QString&)));
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
QLabel *inactive_label =
new QLabel(i18n(
"A&vailable actions:"),
this);
00495 m_inactiveList =
new KListView(
this);
00496 m_inactiveList->
setAllColumnsShowFocus(
true);
00497 m_inactiveList->setMinimumSize(180, 250);
00498 m_inactiveList->
header()->hide();
00499 m_inactiveList->
addColumn(
"");
00500
int column2 = m_inactiveList->
addColumn(
"");
00501 m_inactiveList->
setSorting( column2 );
00502 inactive_label->
setBuddy(m_inactiveList);
00503 connect(m_inactiveList, SIGNAL(selectionChanged(
QListViewItem *)),
00504
this, SLOT(slotInactiveSelected(
QListViewItem *)));
00505
00506
00507
QLabel *active_label =
new QLabel(i18n(
"Curr&ent actions:"),
this);
00508 m_activeList =
new KListView(
this);
00509 m_activeList->
setAllColumnsShowFocus(
true);
00510 m_activeList->setMinimumWidth(m_inactiveList->minimumWidth());
00511 m_activeList->
header()->hide();
00512 m_activeList->
addColumn(
"");
00513 m_activeList->
addColumn(
"");
00514 m_activeList->
setSorting (-1);
00515 active_label->
setBuddy(m_activeList);
00516
00517 connect(m_activeList, SIGNAL(selectionChanged(
QListViewItem *)),
00518
this, SLOT(slotActiveSelected(
QListViewItem *)));
00519
00520
QIconSet iconSet;
00521
00522 m_upAction =
new QToolButton(
this);
00523 iconSet = SmallIconSet(
"up" );
00524 m_upAction->
setIconSet( iconSet );
00525 m_upAction->setEnabled(
false);
00526 m_upAction->setAutoRepeat(
true);
00527 connect(m_upAction, SIGNAL(clicked()), SLOT(slotUpButton()));
00528
00529 m_insertAction =
new QToolButton(
this);
00530 iconSet =
QApplication::reverseLayout() ? SmallIconSet(
"back" ) : SmallIconSet(
"forward" );
00531 m_insertAction->
setIconSet( iconSet );
00532 m_insertAction->setEnabled(
false);
00533 connect(m_insertAction, SIGNAL(clicked()), SLOT(slotInsertButton()));
00534
00535 m_removeAction =
new QToolButton(
this);
00536 iconSet =
QApplication::reverseLayout() ? SmallIconSet(
"forward" ) : SmallIconSet(
"back" );
00537 m_removeAction->
setIconSet( iconSet );
00538 m_removeAction->setEnabled(
false);
00539 connect(m_removeAction, SIGNAL(clicked()), SLOT(slotRemoveButton()));
00540
00541 m_downAction =
new QToolButton(
this);
00542 iconSet = SmallIconSet(
"down" );
00543 m_downAction->
setIconSet( iconSet );
00544 m_downAction->setEnabled(
false);
00545 m_downAction->setAutoRepeat(
true);
00546 connect(m_downAction, SIGNAL(clicked()), SLOT(slotDownButton()));
00547
00548 d->m_helpArea =
new QLabel(
this);
00549 d->m_helpArea->setAlignment( Qt::WordBreak );
00550
00551
00552
QVBoxLayout *top_layout =
new QVBoxLayout(
this, 0, KDialog::spacingHint());
00553
00554
QVBoxLayout *name_layout =
new QVBoxLayout(KDialog::spacingHint());
00555
QHBoxLayout *list_layout =
new QHBoxLayout(KDialog::spacingHint());
00556
00557
QVBoxLayout *inactive_layout =
new QVBoxLayout(KDialog::spacingHint());
00558
QVBoxLayout *active_layout =
new QVBoxLayout(KDialog::spacingHint());
00559
00560
QGridLayout *button_layout =
new QGridLayout(5, 3, 0);
00561
00562 name_layout->addWidget(toolbar_label);
00563 name_layout->addWidget(m_toolbarCombo);
00564
00565
00566
00567 button_layout->
setRowStretch( 0, 10 );
00568 button_layout->
addWidget(m_upAction, 1, 1);
00569 button_layout->
addWidget(m_removeAction, 2, 0);
00570 button_layout->
addWidget(m_insertAction, 2, 2);
00571 button_layout->
addWidget(m_downAction, 3, 1);
00572 button_layout->
setRowStretch( 4, 10 );
00573
00574 inactive_layout->addWidget(inactive_label);
00575 inactive_layout->addWidget(m_inactiveList, 1);
00576
00577 active_layout->addWidget(active_label);
00578 active_layout->addWidget(m_activeList, 1);
00579
00580 list_layout->addLayout(inactive_layout);
00581 list_layout->addLayout(button_layout);
00582 list_layout->addLayout(active_layout);
00583
00584 top_layout->addLayout(name_layout);
00585 top_layout->addWidget(
new KSeparator(
this));
00586 top_layout->addLayout(list_layout,10);
00587 top_layout->addWidget(d->m_helpArea);
00588 top_layout->addWidget(
new KSeparator(
this));
00589 }
00590
00591
void KEditToolbarWidget::loadToolbarCombo(
const QString& defaultToolbar)
00592 {
00593
static const QString &attrName =
KGlobal::staticQString(
"name" );
00594
static const QString &tagText =
KGlobal::staticQString(
"text" );
00595
static const QString &tagText2 =
KGlobal::staticQString(
"Text" );
00596
00597
00598 m_toolbarCombo->
clear();
00599
00600
int defaultToolbarId = 0;
00601
int count = 0;
00602
00603 XmlDataList::Iterator xit = d->m_xmlFiles.begin();
00604
for ( ; xit != d->m_xmlFiles.end(); ++xit)
00605 {
00606
00607
if ( (*xit).m_type == XmlData::Local )
00608
continue;
00609
00610
00611 ToolbarList::Iterator it = (*xit).m_barList.begin();
00612
for ( ; it != (*xit).m_barList.end(); ++it)
00613 {
00614
QString name;
00615
QCString txt( (*it).namedItem( tagText ).toElement().text().utf8() );
00616
if ( txt.isEmpty() )
00617 txt = (*it).namedItem( tagText2 ).toElement().text().
utf8();
00618
if ( txt.isEmpty() )
00619
name = (*it).attribute( attrName );
00620
else
00621
name = i18n( txt );
00622
00623
00624
00625
if ( ( (*xit).m_type == XmlData::Shell ) ||
00626 ( (*xit).m_type == XmlData::Part ) )
00627 {
00628
QString doc_name((*xit).m_document.documentElement().attribute( attrName ));
00629
name +=
" <" + doc_name +
">";
00630 }
00631
00632 m_toolbarCombo->setEnabled(
true );
00633 m_toolbarCombo->
insertItem( name );
00634
if (
name == defaultToolbar)
00635 defaultToolbarId = count;
00636 count++;
00637 }
00638 }
00639
00640
00641 m_toolbarCombo->
setCurrentItem(defaultToolbarId);
00642 slotToolbarSelected(m_toolbarCombo->
currentText());
00643 }
00644
00645
void KEditToolbarWidget::loadActionList(
QDomElement& elem)
00646 {
00647
static const QString &tagSeparator =
KGlobal::staticQString(
"Separator" );
00648
static const QString &tagMerge =
KGlobal::staticQString(
"Merge" );
00649
static const QString &tagActionList=
KGlobal::staticQString(
"ActionList" );
00650
static const QString &attrName =
KGlobal::staticQString(
"name" );
00651
00652
int sep_num = 0;
00653
QString sep_name(
"separator_%1");
00654
00655
00656 m_inactiveList->
clear();
00657 m_activeList->
clear();
00658 m_insertAction->setEnabled(
false);
00659 m_removeAction->setEnabled(
false);
00660 m_upAction->setEnabled(
false);
00661 m_downAction->setEnabled(
false);
00662
00663
00664
QMap<QString, bool> active_list;
00665
00666
00667
QDomElement it = elem.lastChild().toElement();
00668
for( ; !it.isNull(); it = it.previousSibling().toElement() )
00669 {
00670
if (it.
tagName() == tagSeparator)
00671 {
00672 ToolbarItem *act =
new ToolbarItem(m_activeList, tagSeparator, sep_name.arg(sep_num++), QString::null);
00673 act->setText(1,
"-----");
00674 it.
setAttribute( attrName, act->internalName() );
00675
continue;
00676 }
00677
00678
if (it.
tagName() == tagMerge)
00679 {
00680
00681
QString name = it.
attribute( attrName );
00682 ToolbarItem *act =
new ToolbarItem(m_activeList, tagMerge, name, i18n(
"This element will be replaced with all the elements of an embedded component."));
00683
if (
name.
isEmpty() )
00684 act->setText(1, i18n(
"<Merge>"));
00685
else
00686 act->setText(1, i18n(
"<Merge %1>").arg(name));
00687
continue;
00688 }
00689
00690
if (it.
tagName() == tagActionList)
00691 {
00692 ToolbarItem *act =
new ToolbarItem(m_activeList, tagActionList, it.
attribute(attrName), i18n(
"This is a dynamic list of actions. You can move it, but if you remove it you won't be able to re-add it.") );
00693 act->setText(1, i18n(
"ActionList: %1").arg(it.
attribute(attrName)));
00694
continue;
00695 }
00696
00697
00698
for (
unsigned int i = 0; i < d->m_actionList.count(); i++)
00699 {
00700
KAction *
action = d->m_actionList[i];
00701
00702
00703
if (it.
attribute( attrName ) ==
action->name())
00704 {
00705
00706 ToolbarItem *act =
new ToolbarItem(m_activeList, it.
tagName(),
action->name(),
action->toolTip());
00707 act->setText(1,
action->plainText());
00708
if (
action->hasIcon())
00709
if (!
action->icon().
isEmpty())
00710 act->setPixmap(0, BarIcon(
action->icon(), 16));
00711
else
00712 act->setPixmap(0,
action->iconSet(KIcon::Toolbar).pixmap());
00713
00714 active_list.
insert(
action->name(),
true);
00715
break;
00716 }
00717 }
00718 }
00719
00720
00721
for (
int i = d->m_actionList.count() - 1; i > -1; --i)
00722 {
00723
KAction *
action = d->m_actionList[i];
00724
00725
00726
if (active_list.
contains(
action->name()))
00727
continue;
00728
00729 ToolbarItem *act =
new ToolbarItem(m_inactiveList, tagActionList,
action->name(),
action->toolTip());
00730 act->setText(1,
action->plainText());
00731
if (
action->hasIcon())
00732
if (!
action->icon().
isEmpty())
00733 act->setPixmap(0, BarIcon(
action->icon(), 16));
00734
else
00735 act->setPixmap(0,
action->iconSet(KIcon::Toolbar).pixmap());
00736 }
00737
00738
00739 ToolbarItem *act =
new ToolbarItem(m_inactiveList, tagSeparator, sep_name.arg(sep_num++), QString::null);
00740 act->setText(1,
"-----");
00741 }
00742
00743 KActionCollection *
KEditToolbarWidget::actionCollection()
const
00744
{
00745
return d->m_collection;
00746 }
00747
00748
void KEditToolbarWidget::slotToolbarSelected(
const QString& _text)
00749 {
00750
static const QString &attrName =
KGlobal::staticQString(
"name" );
00751
static const QString &tagText =
KGlobal::staticQString(
"text" );
00752
static const QString &tagText2 =
KGlobal::staticQString(
"Text" );
00753
00754
00755 XmlDataList::Iterator xit = d->m_xmlFiles.begin();
00756
for ( ; xit != d->m_xmlFiles.end(); ++xit)
00757 {
00758
00759 ToolbarList::Iterator it = (*xit).m_barList.begin();
00760
for ( ; it != (*xit).m_barList.end(); ++it)
00761 {
00762
QString name;
00763
QCString txt( (*it).namedItem( tagText ).toElement().text().utf8() );
00764
if ( txt.isEmpty() )
00765 txt = (*it).namedItem( tagText2 ).toElement().text().
utf8();
00766
if ( txt.isEmpty() )
00767 name = (*it).attribute( attrName );
00768
else
00769 name = i18n( txt );
00770
00771
00772
00773
if ( ( (*xit).m_type == XmlData::Shell ) ||
00774 ( (*xit).m_type == XmlData::Part ) )
00775 {
00776
QString doc_name((*xit).m_document.documentElement().attribute( attrName ));
00777 name +=
" <" + doc_name +
">";
00778 }
00779
00780
00781
if (
name == _text )
00782 {
00783
00784 d->m_currentXmlData = (*xit);
00785 d->m_currentToolbarElem = (*it);
00786
00787
00788 loadActionList(d->m_currentToolbarElem);
00789
00790
if ((*xit).m_type == XmlData::Part || (*xit).m_type == XmlData::Shell)
00791
setDOMDocument( (*xit).m_document );
00792
return;
00793 }
00794 }
00795 }
00796 }
00797
00798
void KEditToolbarWidget::slotInactiveSelected(
QListViewItem *item)
00799 {
00800
if (item)
00801 {
00802 m_insertAction->setEnabled(
true);
00803
QString statusText = static_cast<ToolbarItem *>(item)->statusText();
00804 d->m_helpArea->setText( statusText );
00805 }
00806
else
00807 {
00808 m_insertAction->setEnabled(
false);
00809 d->m_helpArea->setText( QString::null );
00810 }
00811 }
00812
00813
void KEditToolbarWidget::slotActiveSelected(
QListViewItem *item)
00814 {
00815
if (item)
00816 {
00817 m_removeAction->setEnabled(
true);
00818
00819
if (item->
itemAbove())
00820 m_upAction->setEnabled(
true);
00821
else
00822 m_upAction->setEnabled(
false);
00823
00824
if (item->
itemBelow())
00825 m_downAction->setEnabled(
true);
00826
else
00827 m_downAction->setEnabled(
false);
00828
QString statusText = static_cast<ToolbarItem *>(item)->statusText();
00829 d->m_helpArea->setText( statusText );
00830 }
00831
else
00832 {
00833 m_removeAction->setEnabled(
false);
00834 m_upAction->setEnabled(
false);
00835 m_downAction->setEnabled(
false);
00836 d->m_helpArea->setText( QString::null );
00837 }
00838 }
00839
00840
void KEditToolbarWidget::slotInsertButton()
00841 {
00842
static const QString &tagAction =
KGlobal::staticQString(
"Action" );
00843
static const QString &tagSeparator =
KGlobal::staticQString(
"Separator" );
00844
static const QString &attrName =
KGlobal::staticQString(
"name" );
00845
00846
00847 emit
enableOk(
true);
00848
00849 ToolbarItem *item = (ToolbarItem*)m_inactiveList->
currentItem();
00850
00851
QDomElement new_item;
00852
00853
if (item->text(1) ==
"-----")
00854 new_item =
domDocument().
createElement(tagSeparator);
00855
else
00856 new_item =
domDocument().
createElement(tagAction);
00857 new_item.
setAttribute(attrName, item->internalName());
00858
00859
if (m_activeList->
currentItem())
00860 {
00861
00862
00863 ToolbarItem *act_item = (ToolbarItem*)m_activeList->
currentItem();
00864
QDomElement elem = d->m_currentToolbarElem.firstChild().toElement();
00865
for( ; !elem.isNull(); elem = elem.nextSibling().toElement())
00866 {
00867
if ((elem.
attribute(attrName) == act_item->internalName()) &&
00868 (elem.
tagName() == act_item->internalTag()))
00869 {
00870 d->m_currentToolbarElem.insertAfter(new_item, elem);
00871
break;
00872 }
00873 }
00874 }
00875
else
00876 {
00877
00878 d->m_currentToolbarElem.appendChild(new_item);
00879 }
00880
00881
00882 d->m_currentToolbarElem.setAttribute(QString::fromLatin1(
"noMerge"),
"1");
00883
00884
00885 updateLocal(d->m_currentToolbarElem);
00886
00887 slotToolbarSelected( m_toolbarCombo->
currentText() );
00888 }
00889
00890
void KEditToolbarWidget::slotRemoveButton()
00891 {
00892
static const QString &attrName =
KGlobal::staticQString(
"name" );
00893
static const QString &attrNoMerge =
KGlobal::staticQString(
"noMerge" );
00894
00895
00896 emit
enableOk(
true);
00897
00898 ToolbarItem *item = (ToolbarItem*)m_activeList->
currentItem();
00899
00900
QDomElement elem = d->m_currentToolbarElem.firstChild().toElement();
00901
for( ; !elem.isNull(); elem = elem.nextSibling().toElement())
00902 {
00903
if ((elem.
attribute(attrName) == item->internalName()) &&
00904 (elem.
tagName() == item->internalTag()))
00905 {
00906
00907 d->m_currentToolbarElem.removeChild(elem);
00908
00909
00910 d->m_currentToolbarElem.setAttribute( attrNoMerge,
"1");
00911
00912
00913 updateLocal(d->m_currentToolbarElem);
00914
break;
00915 }
00916 }
00917 slotToolbarSelected( m_toolbarCombo->
currentText() );
00918 }
00919
00920
void KEditToolbarWidget::slotUpButton()
00921 {
00922 ToolbarItem *item = (ToolbarItem*)m_activeList->
currentItem();
00923
00924
00925
if (!item->itemAbove())
00926
return;
00927
00928
static const QString &attrName =
KGlobal::staticQString(
"name" );
00929
static const QString &attrNoMerge =
KGlobal::staticQString(
"noMerge" );
00930
00931
00932 emit
enableOk(
true);
00933
00934
00935
QDomElement elem = d->m_currentToolbarElem.firstChild().toElement();
00936
for( ; !elem.isNull(); elem = elem.nextSibling().toElement())
00937 {
00938
if ((elem.
attribute(attrName) == item->internalName()) &&
00939 (elem.
tagName() == item->internalTag()))
00940 {
00941
00942 ToolbarItem *clone =
new ToolbarItem(m_activeList,
00943 item->itemAbove()->itemAbove(),
00944 item->internalTag(),
00945 item->internalName(),
00946 item->statusText());
00947 clone->setText(1, item->text(1));
00948
00949
00950
if( item->pixmap(0) )
00951 clone->setPixmap(0, *item->pixmap(0));
00952
00953
00954 m_activeList->
takeItem(item);
00955
delete item;
00956
00957
00958 m_activeList->
setSelected(clone,
true);
00959
00960
00961 m_activeList->
ensureItemVisible(clone);
00962
00963
00964
QDomNode prev = elem.previousSibling();
00965
while ( prev.
toElement().tagName() ==
QString(
"WeakSeparator" ) )
00966 prev = prev.
previousSibling();
00967 d->m_currentToolbarElem.insertBefore(elem, prev);
00968
00969
00970 d->m_currentToolbarElem.setAttribute( attrNoMerge,
"1");
00971
00972
00973 updateLocal(d->m_currentToolbarElem);
00974
00975
break;
00976 }
00977 }
00978 }
00979
00980
void KEditToolbarWidget::slotDownButton()
00981 {
00982 ToolbarItem *item = (ToolbarItem*)m_activeList->
currentItem();
00983
00984
00985
if (!item->itemBelow())
00986
return;
00987
00988
static const QString &attrName =
KGlobal::staticQString(
"name" );
00989
static const QString &attrNoMerge =
KGlobal::staticQString(
"noMerge" );
00990
00991
00992 emit
enableOk(
true);
00993
00994
00995
QDomElement elem = d->m_currentToolbarElem.firstChild().toElement();
00996
for( ; !elem.isNull(); elem = elem.nextSibling().toElement())
00997 {
00998
if ((elem.
attribute(attrName) == item->internalName()) &&
00999 (elem.
tagName() == item->internalTag()))
01000 {
01001
01002 ToolbarItem *clone =
new ToolbarItem(m_activeList,
01003 item->itemBelow(),
01004 item->internalTag(),
01005 item->internalName(),
01006 item->statusText());
01007 clone->setText(1, item->text(1));
01008
01009
01010
if( item->pixmap(0) )
01011 clone->setPixmap(0, *item->pixmap(0));
01012
01013
01014 m_activeList->
takeItem(item);
01015
delete item;
01016
01017
01018 m_activeList->
setSelected(clone,
true);
01019
01020
01021 m_activeList->
ensureItemVisible(clone);
01022
01023
01024
QDomNode next = elem.nextSibling();
01025
while (
next.toElement().tagName() ==
QString(
"WeakSeparator" ) )
01026
next =
next.nextSibling();
01027 d->m_currentToolbarElem.insertAfter(elem, next);
01028
01029
01030 d->m_currentToolbarElem.setAttribute( attrNoMerge,
"1");
01031
01032
01033 updateLocal(d->m_currentToolbarElem);
01034
01035
break;
01036 }
01037 }
01038 }
01039
01040
void KEditToolbarWidget::updateLocal(
QDomElement& elem)
01041 {
01042
static const QString &attrName =
KGlobal::staticQString(
"name" );
01043
01044 XmlDataList::Iterator xit = d->m_xmlFiles.begin();
01045
for ( ; xit != d->m_xmlFiles.end(); ++xit)
01046 {
01047
if ( (*xit).m_type == XmlData::Merged )
01048
continue;
01049
01050
if ( (*xit).m_type == XmlData::Shell ||
01051 (*xit).m_type == XmlData::Part )
01052 {
01053
if ( d->m_currentXmlData.m_xmlFile == (*xit).m_xmlFile )
01054 {
01055 (*xit).m_isModified =
true;
01056
return;
01057 }
01058
01059
continue;
01060 }
01061
01062 (*xit).m_isModified =
true;
01063
01064 ToolbarList::Iterator it = (*xit).m_barList.begin();
01065
for ( ; it != (*xit).m_barList.end(); ++it)
01066 {
01067
QString name( (*it).attribute( attrName ) );
01068
QString tag( (*it).tagName() );
01069
if ( (tag != elem.
tagName()) || (
name != elem.
attribute(attrName)) )
01070
continue;
01071
01072
QDomElement toolbar = (*xit).m_document.documentElement().toElement();
01073 toolbar.replaceChild(elem, (*it));
01074
return;
01075 }
01076
01077
01078
QDomElement toolbar = (*xit).m_document.documentElement().toElement();
01079 toolbar.appendChild(elem);
01080 }
01081 }
01082
01083
void KEditToolbar::virtual_hook(
int id,
void* data )
01084 { KDialogBase::virtual_hook(
id, data ); }
01085
01086
void KEditToolbarWidget::virtual_hook(
int id,
void* data )
01087 { KXMLGUIClient::virtual_hook(
id, data ); }
01088
01089
#include "kedittoolbar.moc"