21 #include <kedittoolbar_p.h>
25 #include <QtXml/QDomDocument>
26 #include <QtGui/QLayout>
27 #include <QtCore/QDir>
28 #include <QtCore/QFile>
29 #include <QHeaderView>
30 #include <QtGui/QToolButton>
31 #include <QtGui/QLabel>
32 #include <QtGui/QApplication>
33 #include <QtGui/QGridLayout>
34 #include <QtGui/QCheckBox>
51 #include <kdeversion.h>
60 #define SEPARATORSTRING i18n(separatorstring)
66 namespace KDEPrivate {
78 for( QDomElement elem = start; !elem.isNull(); elem = elem.nextSiblingElement() ) {
79 if (elem.tagName() == tagToolBar) {
80 if ( elem.attribute( attrNoEdit ) !=
"true" )
83 if (elem.tagName() != tagMenuBar)
94 enum XmlType {
Shell = 0, Part, Local, Merged };
97 : m_isModified(false),
100 m_actionCollection(collection)
106 foreach (
const QDomElement& element, m_barList) {
107 kDebug(240) <<
" ToolBar:" << toolBarText( element );
109 if ( m_actionCollection )
110 kDebug(240) <<
" " << m_actionCollection->actions().count() <<
"actions in the collection.";
112 kDebug(240) <<
" no action collection.";
114 QString xmlFile()
const {
return m_xmlFile; }
115 XmlType type()
const {
return m_type; }
117 void setDomDocument(
const QDomDocument& domDoc)
123 QDomDocument& domDocument() {
return m_document; }
124 const QDomDocument& domDocument()
const {
return m_document; }
129 QString toolBarText(
const QDomElement& it )
const;
134 const ToolBarList& barList()
const {
return m_barList; }
139 QDomDocument m_document;
144 QString XmlData::toolBarText(
const QDomElement& it )
const
151 QByteArray txt( it.namedItem( tagText ).toElement().text().toUtf8() );
153 txt = it.namedItem( tagText2 ).toElement().text().toUtf8();
155 name = it.attribute( attrName );
161 if ( ( m_type == XmlData::Shell ) ||
162 ( m_type == XmlData::Part ) ) {
163 QString doc_name(m_document.documentElement().attribute( attrName ));
164 name +=
" <" + doc_name +
'>';
172 class ToolBarItem :
public QListWidgetItem
176 : QListWidgetItem(parent),
178 m_internalName(name),
179 m_statusText(statusText),
180 m_isSeparator(
false),
181 m_isTextAlongsideIconHidden(
false)
184 setFlags((flags() | Qt::ItemIsDragEnabled) & ~Qt::ItemIsDropEnabled);
187 void setInternalTag(
const QString &tag) { m_internalTag = tag; }
188 void setInternalName(
const QString &name) { m_internalName =
name; }
189 void setStatusText(
const QString &text) { m_statusText = text; }
190 void setSeparator(
bool sep) { m_isSeparator = sep; }
191 void setTextAlongsideIconHidden(
bool hidden) { m_isTextAlongsideIconHidden = hidden; }
192 QString internalTag()
const {
return m_internalTag; }
193 QString internalName()
const {
return m_internalName; }
194 QString statusText()
const {
return m_statusText; }
195 bool isSeparator()
const {
return m_isSeparator; }
196 bool isTextAlongsideIconHidden()
const {
return m_isTextAlongsideIconHidden; }
198 int index()
const {
return listWidget()->row(const_cast<ToolBarItem*>(
this)); }
205 bool m_isTextAlongsideIconHidden;
208 static QDataStream &
operator<< ( QDataStream & s,
const ToolBarItem & item ) {
209 s << item.internalTag();
210 s << item.internalName();
211 s << item.statusText();
212 s << item.isSeparator();
213 s << item.isTextAlongsideIconHidden();
216 static QDataStream &
operator>> ( QDataStream & s, ToolBarItem & item ) {
219 item.setInternalTag(internalTag);
222 item.setInternalName(internalName);
225 item.setStatusText(statusText);
228 item.setSeparator(sep);
231 item.setTextAlongsideIconHidden(hidden);
237 ToolBarListWidget::ToolBarListWidget(
QWidget *parent)
241 setDragDropMode(QAbstractItemView::DragDrop);
244 QMimeData* ToolBarListWidget::mimeData(
const QList<QListWidgetItem*> items)
const
248 QMimeData* mimedata =
new QMimeData();
252 QDataStream stream(&data, QIODevice::WriteOnly);
254 ToolBarItem* item =
static_cast<ToolBarItem *
>(items.first());
258 mimedata->setData(
"application/x-kde-action-list", data);
259 mimedata->setData(
"application/x-kde-source-treewidget", m_activeList ?
"active" :
"inactive");
264 bool ToolBarListWidget::dropMimeData(
int index,
const QMimeData * mimeData, Qt::DropAction action)
267 const QByteArray data = mimeData->data("application/x-kde-action-list");
270 QDataStream stream(data);
271 const
bool sourceIsActiveList = mimeData->data("application/x-kde-source-treewidget") == "active";
272 ToolBarItem* item = new ToolBarItem(this);
274 emit dropped(this, index, item, sourceIsActiveList);
278 ToolBarItem* ToolBarListWidget::currentItem()
const
280 return static_cast<ToolBarItem*
>(QListWidget::currentItem());
284 IconTextEditDialog::IconTextEditDialog(
QWidget *parent)
287 setCaption(
i18n(
"Change Text"));
289 setDefaultButton(
Ok);
293 QGridLayout *layout =
new QGridLayout(mainWidget);
294 layout->setMargin(0);
297 m_lineEdit->setClearButtonShown(
true);
299 label->setBuddy(m_lineEdit);
300 layout->addWidget(label, 0, 0);
301 layout->addWidget(m_lineEdit, 0, 1);
303 m_cbHidden =
new QCheckBox(
i18n(
"&Hide text when toolbar shows text alongside icons"), mainWidget);
304 layout->addWidget(m_cbHidden, 1, 1);
306 connect(m_lineEdit, SIGNAL(textChanged(
QString)), SLOT(slotTextChanged(
QString)));
308 m_lineEdit->setFocus();
309 setMainWidget(mainWidget);
310 setFixedHeight(sizeHint().height());
313 void IconTextEditDialog::setIconText(
const QString &text)
315 m_lineEdit->setText(text);
318 QString IconTextEditDialog::iconText()
const
320 return m_lineEdit->text().trimmed();
323 void IconTextEditDialog::setTextAlongsideIconHidden(
bool hidden)
325 m_cbHidden->setChecked(hidden);
328 bool IconTextEditDialog::textAlongsideIconHidden()
const
330 return m_cbHidden->isChecked();
333 void IconTextEditDialog::slotTextChanged(
const QString &text)
336 enableButton(
Ok, !text.trimmed().isEmpty());
340 class KEditToolBarWidgetPrivate
350 KEditToolBarWidgetPrivate(KEditToolBarWidget* widget,
352 : m_collection( collection ),
355 m_loadedOnce( false )
357 m_componentData = cData;
360 m_kdialogProcess = 0;
363 const int iconSize = widget->style()->pixelMetric(QStyle::PM_SmallIconSize);
364 m_emptyIcon = QPixmap(iconSize, iconSize);
365 m_emptyIcon.fill(Qt::transparent);
367 ~KEditToolBarWidgetPrivate()
372 void slotToolBarSelected(
int index);
374 void slotInactiveSelectionChanged();
375 void slotActiveSelectionChanged();
377 void slotInsertButton();
378 void slotRemoveButton();
380 void slotDownButton();
382 void selectActiveItem(
const QString&);
384 void slotChangeIcon();
385 void slotChangeIconText();
387 void slotProcessExited();
389 void slotDropped(ToolBarListWidget* list,
int index, ToolBarItem* item,
bool sourceIsActiveList);
394 void initOldStyle(
const QString& file,
bool global,
const QString& defaultToolbar );
396 void loadToolBarCombo(
const QString& defaultToolbar );
397 void loadActions(
const QDomElement& elem);
401 return xml_file.isEmpty() ?
QString(m_componentData.componentName()) +
"ui.rc" :
411 QString xml_file = xmlFile(_xml_file);
414 if ( !QDir::isRelativePath(xml_file) )
425 QDomElement findElementForToolBarItem(
const ToolBarItem* item )
const
429 for(QDomNode n = m_currentToolBarElem.firstChild(); !n.isNull(); n = n.nextSibling())
431 QDomElement elem = n.toElement();
432 if ((elem.attribute(attrName) == item->internalName()) &&
433 (elem.tagName() == item->internalTag()))
437 return QDomElement();
440 void insertActive(ToolBarItem *item, ToolBarItem *before,
bool prepend =
false);
441 void removeActive(ToolBarItem *item);
442 void moveActive(ToolBarItem *item, ToolBarItem *before);
443 void updateLocal(QDomElement& elem);
448 XmlDataList::const_iterator xit = m_xmlFiles.begin();
449 for ( ; xit != m_xmlFiles.end(); ++xit ) {
464 KEditToolBarWidget* m_widget;
470 XmlData* m_currentXmlData;
471 QDomElement m_currentToolBarElem;
476 QDomDocument m_localDoc;
479 ToolBarListWidget *m_inactiveList;
480 ToolBarListWidget *m_activeList;
491 bool m_hasKDialog : 1;
492 bool m_loadedOnce : 1;
497 using namespace KDEPrivate;
500 class KEditToolBarPrivate {
503 m_accept(false), m_global(false),
504 m_collection(0), m_factory(0), m_widget(0) {}
510 void _k_acceptOK(
bool);
511 void _k_slotDefault();
521 KEditToolBarWidget *m_widget;
529 d(new KEditToolBarPrivate(this))
531 d->m_widget =
new KEditToolBarWidget( collection,
this);
533 d->m_collection = collection;
539 d(new KEditToolBarPrivate(this))
541 d->m_widget =
new KEditToolBarWidget(
this);
543 d->m_factory = factory;
546 void KEditToolBarPrivate::init()
551 q->setDefaultToolBar(
QString() );
553 q->setCaption(
i18n(
"Configure Toolbars"));
559 q->setMainWidget(m_widget);
561 q->connect(m_widget, SIGNAL(enableOk(
bool)), SLOT(_k_acceptOK(
bool)));
562 q->connect(m_widget, SIGNAL(enableOk(
bool)), SLOT(enableButtonApply(
bool)));
563 q->enableButtonApply(
false);
565 q->connect(q, SIGNAL(okClicked()), SLOT(_k_slotOk()));
566 q->connect(q, SIGNAL(applyClicked()), SLOT(_k_slotApply()));
567 q->connect(q, SIGNAL(defaultClicked()), SLOT(_k_slotDefault()));
569 q->setMinimumSize(q->sizeHint());
575 d->m_global = global;
576 d->m_widget->load( d->m_file, d->m_global, d->m_defaultToolBar );
582 s_defaultToolBarName->clear();
587 if ( toolBarName.isEmpty() ) {
588 d->m_defaultToolBar = *s_defaultToolBarName;
590 d->m_defaultToolBar = toolBarName;
594 void KEditToolBarPrivate::_k_acceptOK(
bool b)
596 q->enableButtonOk(b);
600 void KEditToolBarPrivate::_k_slotDefault()
605 KEditToolBarWidget * oldWidget = m_widget;
616 kDebug(240) <<
"Deleting local xml file" << file;
618 if ( QFile::exists( file ) )
620 kWarning() <<
"Could not delete" << file;
624 oldWidget->rebuildKXMLGUIClients();
626 m_widget =
new KEditToolBarWidget( q );
627 m_widget->load( m_factory, m_defaultToolBar );
631 int slash = m_file.lastIndexOf(
'/')+1;
633 m_file = m_file.mid(slash);
636 if ( QFile::exists( xml_file ) )
638 kWarning() <<
"Could not delete " << xml_file;
640 m_widget =
new KEditToolBarWidget( m_collection, q );
641 q->setResourceFile( m_file, m_global );
645 m_widget->setGeometry( oldWidget->geometry() );
646 q->setMainWidget(m_widget);
649 q->connect(m_widget, SIGNAL(enableOk(
bool)), SLOT(_k_acceptOK(
bool)));
650 q->connect(m_widget, SIGNAL(enableOk(
bool)), SLOT(enableButtonApply(
bool)));
652 q->enableButtonApply(
false);
654 emit q->newToolBarConfig();
655 emit q->newToolbarConfig();
658 void KEditToolBarPrivate::_k_slotOk()
665 if (!m_widget->save())
674 emit q->newToolBarConfig();
675 emit q->newToolbarConfig();
681 void KEditToolBarPrivate::_k_slotApply()
683 (void)m_widget->save();
684 q->enableButtonApply(
false);
685 emit q->newToolBarConfig();
686 emit q->newToolbarConfig();
691 *s_defaultToolBarName = QString::fromLatin1(toolbarName);
697 d(new KEditToolBarWidgetPrivate(this, componentData(), collection))
702 KEditToolBarWidget::KEditToolBarWidget(
QWidget *parent )
704 d(new KEditToolBarWidgetPrivate(this, componentData(),
KXMLGUIClient::actionCollection() ))
709 KEditToolBarWidget::~KEditToolBarWidget()
714 void KEditToolBarWidget::load(
const QString& file,
bool global,
const QString& defaultToolBar )
716 d->initOldStyle( file, global, defaultToolBar );
721 d->initFromFactory( factory, defaultToolBar );
724 void KEditToolBarWidgetPrivate::initOldStyle(
const QString& resourceFile,
726 const QString& defaultToolBar )
729 if ( m_loadedOnce ) {
738 m_widget->loadStandardsXmlFile();
739 const QString localXML = loadXMLFile( resourceFile );
740 m_widget->setXML(localXML, global ?
true :
false);
743 XmlData local(XmlData::Local, xmlFile(resourceFile), m_collection);
745 domDoc.setContent(localXML);
746 local.setDomDocument(domDoc);
747 m_xmlFiles.append(local);
750 XmlData merge(XmlData::Merged,
QString(), m_collection);
751 merge.setDomDocument(m_widget->domDocument());
752 m_xmlFiles.append(merge);
759 loadToolBarCombo( defaultToolBar );
760 m_widget->adjustSize();
761 m_widget->setMinimumSize( m_widget->sizeHint() );
764 void KEditToolBarWidgetPrivate::initFromFactory(
KXMLGUIFactory* factory,
768 if ( m_loadedOnce ) {
780 if (client->
xmlFile().isEmpty())
783 XmlData::XmlType type = XmlData::Part;
785 type = XmlData::Shell;
792 data.setDomDocument(domDoc);
793 m_xmlFiles.append(data);
803 loadToolBarCombo( defaultToolBar );
804 m_widget->adjustSize();
805 m_widget->setMinimumSize( m_widget->sizeHint() );
807 m_widget->actionCollection()->addAssociatedWidget( m_widget );
808 foreach (
QAction* action, m_widget->actionCollection()->actions())
809 action->setShortcutContext(Qt::WidgetWithChildrenShortcut);
815 XmlDataList::Iterator it = d->m_xmlFiles.begin();
816 for ( ; it != d->m_xmlFiles.end(); ++it)
819 if ( !((*it).m_isModified) )
823 if ( (*it).type() == XmlData::Merged )
826 kDebug() << (*it).domDocument().toString();
828 kDebug(240) <<
"Saving " << (*it).xmlFile();
836 rebuildKXMLGUIClients();
841 void KEditToolBarWidget::rebuildKXMLGUIClients()
846 const QList<KXMLGUIClient*> clients = d->m_factory->clients();
850 if (!clients.count())
853 QListIterator<KXMLGUIClient*> clientIterator = clients;
854 clientIterator.toBack();
855 while (clientIterator.hasPrevious()) {
858 d->m_factory->removeClient(client);
869 if ( !file.isEmpty() )
875 if ( client == firstClient )
879 client->
setXMLFile( file, client == firstClient );
889 d->m_factory->addClient(client);
893 void KEditToolBarWidgetPrivate::setupLayout()
896 m_comboLabel =
new QLabel(
i18n(
"&Toolbar:"), m_widget);
897 m_toolbarCombo =
new KComboBox(m_widget);
898 m_comboLabel->setBuddy(m_toolbarCombo);
900 QObject::connect(m_toolbarCombo, SIGNAL(activated(
int)),
901 m_widget, SLOT(slotToolBarSelected(
int)));
912 m_inactiveList =
new ToolBarListWidget(m_widget);
913 m_inactiveList->setDragEnabled(
true);
914 m_inactiveList->setActiveList(
false);
915 m_inactiveList->setMinimumSize(180, 250);
916 m_inactiveList->setDropIndicatorShown(
false);
917 inactive_label->setBuddy(m_inactiveList);
918 QObject::connect(m_inactiveList, SIGNAL(itemSelectionChanged()),
919 m_widget, SLOT(slotInactiveSelectionChanged()));
920 QObject::connect(m_inactiveList, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
921 m_widget, SLOT(slotInsertButton()));
922 QObject::connect(m_inactiveList, SIGNAL(dropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)),
923 m_widget, SLOT(slotDropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)));
930 m_activeList =
new ToolBarListWidget(m_widget);
931 m_activeList->setDragEnabled(
true);
932 m_activeList->setActiveList(
true);
934 m_activeList->setMinimumSize(m_inactiveList->minimumWidth(), 100);
935 active_label->setBuddy(m_activeList);
937 QObject::connect(m_activeList, SIGNAL(itemSelectionChanged()),
938 m_widget, SLOT(slotActiveSelectionChanged()));
939 QObject::connect(m_activeList, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
940 m_widget, SLOT(slotRemoveButton()));
941 QObject::connect(m_activeList, SIGNAL(dropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)),
942 m_widget, SLOT(slotDropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)));
949 m_changeIcon->setIcon(
KIcon(
"preferences-desktop-icons"));
951 m_hasKDialog = !kdialogExe.isEmpty();
952 m_changeIcon->setEnabled(m_hasKDialog && m_activeList->currentItem());
954 QObject::connect( m_changeIcon, SIGNAL(clicked()),
955 m_widget, SLOT(slotChangeIcon()) );
958 m_changeIconText =
new KPushButton(
i18n(
"Change Te&xt..." ), m_widget);
959 m_changeIconText->setIcon(
KIcon(
"edit-rename"));
960 m_changeIconText->setEnabled(m_activeList->currentItem() != 0);
962 QObject::connect( m_changeIconText, SIGNAL(clicked()),
963 m_widget, SLOT(slotChangeIconText()) );
968 m_upAction->setIcon(
KIcon(
"go-up") );
969 m_upAction->setEnabled(
false);
970 m_upAction->setAutoRepeat(
true);
971 QObject::connect(m_upAction, SIGNAL(clicked()), m_widget, SLOT(slotUpButton()));
974 m_insertAction->setIcon(
KIcon(QApplication::isRightToLeft() ?
"go-previous" :
"go-next") );
975 m_insertAction->setEnabled(
false);
976 QObject::connect(m_insertAction, SIGNAL(clicked()), m_widget, SLOT(slotInsertButton()));
979 m_removeAction->setIcon(
KIcon(QApplication::isRightToLeft() ?
"go-next" :
"go-previous") );
980 m_removeAction->setEnabled(
false);
981 QObject::connect(m_removeAction, SIGNAL(clicked()), m_widget, SLOT(slotRemoveButton()));
984 m_downAction->setIcon(
KIcon(
"go-down") );
985 m_downAction->setEnabled(
false);
986 m_downAction->setAutoRepeat(
true);
987 QObject::connect(m_downAction, SIGNAL(clicked()), m_widget, SLOT(slotDownButton()));
989 m_helpArea =
new QLabel(m_widget);
990 m_helpArea->setWordWrap(
true);
993 QVBoxLayout *top_layout =
new QVBoxLayout(m_widget);
994 top_layout->setMargin(0);
996 QVBoxLayout *name_layout =
new QVBoxLayout();
997 QHBoxLayout *list_layout =
new QHBoxLayout();
999 QVBoxLayout *inactive_layout =
new QVBoxLayout();
1000 QVBoxLayout *active_layout =
new QVBoxLayout();
1001 QHBoxLayout *changeIcon_layout =
new QHBoxLayout();
1003 QGridLayout *button_layout =
new QGridLayout();
1005 name_layout->addWidget(m_comboLabel);
1006 name_layout->addWidget(m_toolbarCombo);
1010 button_layout->setSpacing( 0 );
1011 button_layout->setRowStretch( 0, 10 );
1012 button_layout->addWidget(m_upAction, 1, 1);
1013 button_layout->addWidget(m_removeAction, 2, 0);
1014 button_layout->addWidget(m_insertAction, 2, 2);
1015 button_layout->addWidget(m_downAction, 3, 1);
1016 button_layout->setRowStretch( 4, 10 );
1018 inactive_layout->addWidget(inactive_label);
1019 inactive_layout->addWidget(inactiveListSearchLine);
1020 inactive_layout->addWidget(m_inactiveList, 1);
1022 active_layout->addWidget(active_label);
1023 active_layout->addWidget(activeListSearchLine);
1024 active_layout->addWidget(m_activeList, 1);
1025 active_layout->addLayout(changeIcon_layout);
1027 changeIcon_layout->addWidget(m_changeIcon);
1028 changeIcon_layout->addStretch( 1 );
1029 changeIcon_layout->addWidget(m_changeIconText);
1031 list_layout->addLayout(inactive_layout);
1032 list_layout->addLayout(button_layout);
1033 list_layout->addLayout(active_layout);
1035 top_layout->addLayout(name_layout);
1036 top_layout->addWidget(m_comboSeparator);
1037 top_layout->addLayout(list_layout,10);
1038 top_layout->addWidget(m_helpArea);
1039 top_layout->addWidget(
new KSeparator(m_widget));
1042 void KEditToolBarWidgetPrivate::loadToolBarCombo(
const QString& defaultToolBar )
1044 const QLatin1String attrName(
"name" );
1046 m_toolbarCombo->clear();
1048 int defaultToolBarId = -1;
1051 XmlDataList::const_iterator xit = m_xmlFiles.constBegin();
1052 for ( ; xit != m_xmlFiles.constEnd(); ++xit)
1057 if ( (*xit).type() == XmlData::Merged )
1061 ToolBarList::const_iterator it = (*xit).barList().begin();
1062 for ( ; it != (*xit).barList().constEnd(); ++it)
1064 const QString text = (*xit).toolBarText( *it );
1065 m_toolbarCombo->addItem( text );
1066 const QString name = (*it).attribute(attrName);
1067 if (defaultToolBarId == -1 && name == defaultToolBar)
1068 defaultToolBarId = count;
1072 const bool showCombo = (count > 1);
1073 m_comboLabel->setVisible(showCombo);
1074 m_comboSeparator->setVisible(showCombo);
1075 m_toolbarCombo->setVisible(showCombo);
1076 if (defaultToolBarId == -1)
1077 defaultToolBarId = 0;
1079 m_toolbarCombo->setCurrentIndex(defaultToolBarId);
1080 slotToolBarSelected(m_toolbarCombo->currentIndex());
1083 void KEditToolBarWidgetPrivate::loadActions(
const QDomElement& elem)
1085 const QLatin1String tagSeparator(
"Separator" );
1086 const QLatin1String tagMerge(
"Merge" );
1087 const QLatin1String tagActionList(
"ActionList" );
1088 const QLatin1String tagAction(
"Action" );
1089 const QLatin1String attrName(
"name" );
1092 QString sep_name(
"separator_%1");
1095 m_inactiveList->clear();
1096 m_activeList->clear();
1097 m_insertAction->setEnabled(
false);
1098 m_removeAction->setEnabled(
false);
1099 m_upAction->setEnabled(
false);
1100 m_downAction->setEnabled(
false);
1106 QSet<QString> active_list;
1112 QDomNode n = elem.firstChild();
1113 for( ; !n.isNull(); n = n.nextSibling() )
1115 QDomElement it = n.toElement();
1116 if (it.isNull())
continue;
1117 if (it.tagName() == tagSeparator)
1119 ToolBarItem *act =
new ToolBarItem(m_activeList, tagSeparator, sep_name.arg(sep_num++),
QString());
1120 act->setSeparator(
true);
1122 it.setAttribute( attrName, act->internalName() );
1126 if (it.tagName() == tagMerge)
1129 QString name = it.attribute( attrName );
1130 ToolBarItem *act =
new ToolBarItem(m_activeList, tagMerge, name,
i18n(
"This element will be replaced with all the elements of an embedded component."));
1131 if ( name.isEmpty() )
1132 act->setText(
i18n(
"<Merge>"));
1134 act->setText(
i18n(
"<Merge %1>", name));
1138 if (it.tagName() == tagActionList)
1140 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 will not be able to re-add it.") );
1141 act->setText(
i18n(
"ActionList: %1", it.attribute(attrName)));
1151 if (it.attribute( attrName ) == action->objectName())
1154 ToolBarItem *act =
new ToolBarItem(m_activeList, it.tagName(), action->objectName(), action->toolTip());
1156 act->setIcon(!action->icon().isNull() ? action->icon() : m_emptyIcon);
1157 act->setTextAlongsideIconHidden(action->priority() < QAction::NormalPriority);
1159 active_list.insert(action->objectName());
1169 if (active_list.contains(action->objectName()))
1172 ToolBarItem *act =
new ToolBarItem(m_inactiveList, tagAction, action->objectName(), action->toolTip());
1174 act->setIcon(!action->icon().isNull() ? action->icon() : m_emptyIcon);
1177 m_inactiveList->sortItems(Qt::AscendingOrder);
1180 ToolBarItem *act =
new ToolBarItem(0L, tagSeparator, sep_name.arg(sep_num++),
QString());
1181 act->setSeparator(
true);
1183 m_inactiveList->insertItem(0, act);
1188 return d->m_collection;
1191 void KEditToolBarWidgetPrivate::slotToolBarSelected(
int index)
1193 const QLatin1String attrName(
"name" );
1197 int toolbarNumber = 0;
1198 XmlDataList::iterator xit = m_xmlFiles.begin();
1199 for ( ; xit != m_xmlFiles.end(); ++xit) {
1203 if ( (*xit).type() == XmlData::Merged )
1207 ToolBarList::Iterator it = (*xit).barList().begin();
1208 for ( ; it != (*xit).barList().end(); ++it) {
1211 if (toolbarNumber == index) {
1214 m_currentXmlData = & (*xit);
1215 m_currentToolBarElem = *it;
1217 kDebug() <<
"found toolbar" << m_currentXmlData->toolBarText(*it) <<
"m_currentXmlData set to";
1218 m_currentXmlData->dump();
1221 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1224 loadActions(m_currentToolBarElem);
1226 if ((*xit).type() == XmlData::Part || (*xit).type() == XmlData::Shell)
1227 m_widget->setDOMDocument( (*xit).domDocument() );
1236 void KEditToolBarWidgetPrivate::slotInactiveSelectionChanged()
1238 if (m_inactiveList->selectedItems().count())
1240 m_insertAction->setEnabled(
true);
1241 QString statusText =
static_cast<ToolBarItem*
>(m_inactiveList->selectedItems().first())->statusText();
1242 m_helpArea->setText(
i18nc(
"@label Action tooltip in toolbar editor, below the action list",
"%1", statusText) );
1246 m_insertAction->setEnabled(
false);
1247 m_helpArea->setText(
QString() );
1251 void KEditToolBarWidgetPrivate::slotActiveSelectionChanged()
1253 ToolBarItem* toolitem = 0;
1254 if (!m_activeList->selectedItems().isEmpty())
1255 toolitem = static_cast<ToolBarItem *>(m_activeList->selectedItems().first());
1257 m_removeAction->setEnabled( toolitem );
1259 m_changeIcon->setEnabled( toolitem &&
1261 toolitem->internalTag() ==
"Action" );
1263 m_changeIconText->setEnabled( toolitem &&
1264 toolitem->internalTag() ==
"Action" );
1268 m_upAction->setEnabled(toolitem->index() != 0);
1269 m_downAction->setEnabled(toolitem->index() != toolitem->listWidget()->count() - 1);
1271 QString statusText = toolitem->statusText();
1272 m_helpArea->setText(
i18nc(
"@label Action tooltip in toolbar editor, below the action list",
"%1", statusText) );
1276 m_upAction->setEnabled(
false);
1277 m_downAction->setEnabled(
false);
1278 m_helpArea->setText(
QString() );
1282 void KEditToolBarWidgetPrivate::slotInsertButton()
1284 QString internalName =
static_cast<ToolBarItem *
>(m_inactiveList->currentItem())->internalName();
1286 insertActive(m_inactiveList->currentItem(), m_activeList->currentItem(),
false);
1288 emit m_widget->enableOk(
true);
1290 slotToolBarSelected( m_toolbarCombo->currentIndex() );
1292 selectActiveItem( internalName );
1295 void KEditToolBarWidgetPrivate::selectActiveItem(
const QString& internalName)
1297 int activeItemCount = m_activeList->count();
1298 for(
int i = 0; i < activeItemCount; i++)
1300 ToolBarItem * item =
static_cast<ToolBarItem *
>(m_activeList->item(i));
1301 if (item->internalName()==internalName)
1303 m_activeList->setCurrentItem(item);
1309 void KEditToolBarWidgetPrivate::slotRemoveButton()
1311 removeActive( m_activeList->currentItem() );
1314 emit m_widget->enableOk(
true);
1316 slotToolBarSelected( m_toolbarCombo->currentIndex() );
1319 void KEditToolBarWidgetPrivate::insertActive(ToolBarItem *item, ToolBarItem *before,
bool prepend)
1329 QDomElement new_item;
1331 if (item->isSeparator())
1332 new_item = m_widget->domDocument().createElement(tagSeparator);
1334 new_item = m_widget->domDocument().createElement(tagAction);
1336 new_item.setAttribute(attrName, item->internalName());
1338 Q_ASSERT(!m_currentToolBarElem.isNull());
1344 QDomElement elem = findElementForToolBarItem( before );
1345 Q_ASSERT( !elem.isNull() );
1346 m_currentToolBarElem.insertAfter(new_item, elem);
1352 m_currentToolBarElem.insertBefore(new_item, m_currentToolBarElem.firstChild());
1354 m_currentToolBarElem.appendChild(new_item);
1358 m_currentToolBarElem.setAttribute( attrNoMerge,
"1");
1361 updateLocal(m_currentToolBarElem);
1364 void KEditToolBarWidgetPrivate::removeActive(ToolBarItem *item)
1372 emit m_widget->enableOk(
true);
1375 QDomElement elem = findElementForToolBarItem( item );
1376 if ( !elem.isNull() )
1379 m_currentToolBarElem.removeChild(elem);
1382 m_currentToolBarElem.setAttribute( attrNoMerge,
"1");
1385 updateLocal(m_currentToolBarElem);
1389 void KEditToolBarWidgetPrivate::slotUpButton()
1391 ToolBarItem *item = m_activeList->currentItem();
1398 int row = item->listWidget()->row(item) - 1;
1406 emit m_widget->enableOk(
true);
1408 moveActive( item, static_cast<ToolBarItem*>(item->listWidget()->item(row - 1)) );
1411 void KEditToolBarWidgetPrivate::moveActive( ToolBarItem* item, ToolBarItem* before )
1413 QDomElement e = findElementForToolBarItem( item );
1419 m_activeList->takeItem(m_activeList->row(item));
1422 m_activeList->insertItem(m_activeList->row(before) + 1, item);
1425 m_activeList->setCurrentItem(item);
1429 m_currentToolBarElem.insertBefore(e, m_currentToolBarElem.firstChild() );
1431 m_currentToolBarElem.insertAfter(e, findElementForToolBarItem( (ToolBarItem*)before ));
1435 m_currentToolBarElem.setAttribute( attrNoMerge,
"1");
1438 updateLocal(m_currentToolBarElem);
1441 void KEditToolBarWidgetPrivate::slotDownButton()
1443 ToolBarItem *item = m_activeList->currentItem();
1451 int newRow = item->listWidget()->row(item) + 1;
1452 if (newRow >= item->listWidget()->count()) {
1458 emit m_widget->enableOk(
true);
1460 moveActive( item, static_cast<ToolBarItem*>(item->listWidget()->item(newRow)) );
1463 void KEditToolBarWidgetPrivate::updateLocal(QDomElement& elem)
1467 XmlDataList::Iterator xit = m_xmlFiles.begin();
1468 for ( ; xit != m_xmlFiles.end(); ++xit)
1470 if ( (*xit).type() == XmlData::Merged )
1473 if ( (*xit).type() == XmlData::Shell ||
1474 (*xit).type() == XmlData::Part )
1476 if ( m_currentXmlData->xmlFile() == (*xit).xmlFile() )
1478 (*xit).m_isModified =
true;
1485 (*xit).m_isModified =
true;
1487 ToolBarList::Iterator it = (*xit).barList().begin();
1488 for ( ; it != (*xit).barList().end(); ++it)
1491 QString tag( (*it).tagName() );
1492 if ( (tag != elem.tagName()) || (name != elem.attribute(attrName)) )
1495 QDomElement toolbar = (*xit).domDocument().documentElement().toElement();
1496 toolbar.replaceChild(elem, (*it));
1501 QDomElement toolbar = (*xit).domDocument().documentElement().toElement();
1502 Q_ASSERT(!toolbar.isNull());
1503 toolbar.appendChild(elem);
1507 void KEditToolBarWidgetPrivate::slotChangeIcon()
1515 if ( m_kdialogProcess && m_kdialogProcess->state() == QProcess::Running )
1518 m_currentXmlData->dump();
1519 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1523 (*m_kdialogProcess) << kdialogExe;
1524 (*m_kdialogProcess) <<
"--caption";
1525 (*m_kdialogProcess) <<
i18n(
"Change Icon" );
1526 (*m_kdialogProcess) <<
"--embed";
1527 (*m_kdialogProcess) << QString::number( (quintptr)m_widget->window()->winId() );
1528 (*m_kdialogProcess) <<
"--geticon";
1529 (*m_kdialogProcess) <<
"Toolbar";
1530 (*m_kdialogProcess) <<
"Actions";
1532 m_kdialogProcess->setNextOpenMode( QIODevice::ReadOnly | QIODevice::Text );
1533 m_kdialogProcess->start();
1534 if ( !m_kdialogProcess->waitForStarted() ) {
1535 kError(240) <<
"Can't run " << kdialogExe << endl;
1536 delete m_kdialogProcess;
1537 m_kdialogProcess = 0;
1541 m_activeList->setEnabled(
false );
1542 m_toolbarCombo->setEnabled(
false );
1544 QObject::connect( m_kdialogProcess, SIGNAL(finished(
int,QProcess::ExitStatus)),
1545 m_widget, SLOT(slotProcessExited()) );
1548 void KEditToolBarWidgetPrivate::slotChangeIconText()
1550 m_currentXmlData->dump();
1551 ToolBarItem *item = m_activeList->currentItem();
1554 QString iconText = item->text();
1555 bool hidden = item->isTextAlongsideIconHidden();
1557 IconTextEditDialog dialog(m_widget);
1558 dialog.setIconText(iconText);
1559 dialog.setTextAlongsideIconHidden(hidden);
1561 bool ok = dialog.exec() == KDialog::Accepted;
1562 iconText = dialog.iconText();
1563 hidden = dialog.textAlongsideIconHidden();
1565 bool hiddenChanged = hidden != item->isTextAlongsideIconHidden();
1566 bool iconTextChanged = iconText != item->text();
1568 if (!ok || (!hiddenChanged && !iconTextChanged))
1571 item->setText(iconText);
1572 item->setTextAlongsideIconHidden(hidden);
1574 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1576 m_currentXmlData->m_isModified =
true;
1582 Q_ASSERT( !act_elem.isNull() );
1583 if (iconTextChanged)
1584 act_elem.setAttribute(
"iconText", iconText );
1586 act_elem.setAttribute(
"priority", hidden ? QAction::LowPriority : QAction::NormalPriority );
1589 emit m_widget->enableOk(
true);
1593 void KEditToolBarWidgetPrivate::slotProcessExited()
1595 m_activeList->setEnabled(
true );
1596 m_toolbarCombo->setEnabled(
true );
1600 if (!m_kdialogProcess) {
1601 kError(240) <<
"Something is wrong here! m_kdialogProcess is zero!" << endl;
1605 icon = QString::fromLocal8Bit( m_kdialogProcess->readLine() );
1606 icon = icon.left( icon.indexOf(
'\n' ) );
1607 kDebug(240) <<
"icon=" << icon;
1608 if ( m_kdialogProcess->exitStatus() != QProcess::NormalExit ||
1610 delete m_kdialogProcess;
1611 m_kdialogProcess = 0;
1615 ToolBarItem *item = m_activeList->currentItem();
1618 item->setIcon(
KIcon(icon));
1620 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1622 m_currentXmlData->m_isModified =
true;
1628 Q_ASSERT( !act_elem.isNull() );
1629 act_elem.setAttribute(
"icon", icon );
1632 emit m_widget->enableOk(
true);
1635 delete m_kdialogProcess;
1636 m_kdialogProcess = 0;
1639 void KEditToolBarWidgetPrivate::slotDropped(ToolBarListWidget* list,
int index, ToolBarItem* item,
bool sourceIsActiveList)
1643 if (list == m_activeList) {
1644 ToolBarItem* after = index > 0 ?
static_cast<ToolBarItem *
>(list->item(index-1)) : 0;
1646 if (sourceIsActiveList) {
1648 moveActive(item, after);
1651 insertActive(item, after,
true);
1653 }
else if (list == m_inactiveList) {
1661 emit m_widget->enableOk(
true);
1663 slotToolBarSelected( m_toolbarCombo->currentIndex() );
1669 if (!event->spontaneous()) {
1671 if ( d->m_factory ) {
1673 d->m_widget->load( d->m_factory, d->m_defaultToolBar );
1676 d->m_widget->load( d->m_file, d->m_global, d->m_defaultToolBar );
1692 #include "kedittoolbar.moc"
1693 #include "kedittoolbar_p.moc"