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)
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; }
124 const QDomDocument& domDocument()
const {
return m_document; }
134 const ToolBarList& barList()
const {
return m_barList; }
161 if ( ( m_type == XmlData::Shell ) ||
162 ( m_type == XmlData::Part ) ) {
163 QString doc_name(m_document.documentElement().attribute( attrName ));
164 name +=
" <" + doc_name +
'>';
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;
209 s << item.internalTag();
210 s << item.internalName();
211 s << item.statusText();
212 s << item.isSeparator();
213 s << item.isTextAlongsideIconHidden();
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);
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");
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
284 IconTextEditDialog::IconTextEditDialog(
QWidget *parent)
287 setCaption(
i18n(
"Change Text"));
289 setDefaultButton(
Ok);
297 m_lineEdit->setClearButtonShown(
true);
303 m_cbHidden =
new QCheckBox(
i18n(
"&Hide text when toolbar shows text alongside icons"), mainWidget);
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)
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 );
401 return xml_file.
isEmpty() ?
QString(m_componentData.componentName()) +
"ui.rc" :
411 QString xml_file = xmlFile(_xml_file);
425 QDomElement findElementForToolBarItem(
const ToolBarItem* item )
const
432 if ((elem.
attribute(attrName) == item->internalName()) &&
433 (elem.
tagName() == item->internalTag()))
440 void insertActive(ToolBarItem *item, ToolBarItem *before,
bool prepend =
false);
441 void removeActive(ToolBarItem *item);
442 void moveActive(ToolBarItem *item, ToolBarItem *before);
448 XmlDataList::const_iterator xit = m_xmlFiles.begin();
449 for ( ; xit != m_xmlFiles.end(); ++xit ) {
464 KEditToolBarWidget* m_widget;
470 XmlData* m_currentXmlData;
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();
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;
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);
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();
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);
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 ) {
783 XmlData::XmlType type = XmlData::Part;
785 type = XmlData::Shell;
792 data.setDomDocument(domDoc);
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())
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 )
827 QDomNodeList menuNodes = (*it).domDocument().elementsByTagName(
"Menu" );
828 for (uint i = 0; i < menuNodes.
length(); ++i)
832 if (menuElement.
isNull())
continue;
836 kDebug() << (*it).domDocument().toString();
838 kDebug(240) <<
"Saving " << (*it).xmlFile();
846 rebuildKXMLGUIClients();
851 void KEditToolBarWidget::rebuildKXMLGUIClients()
860 if (!clients.
count())
868 d->m_factory->removeClient(client);
885 if ( client == firstClient )
889 client->
setXMLFile( file, client == firstClient );
899 d->m_factory->addClient(client);
903 void KEditToolBarWidgetPrivate::setupLayout()
906 m_comboLabel =
new QLabel(
i18n(
"&Toolbar:"), m_widget);
907 m_toolbarCombo =
new KComboBox(m_widget);
908 m_comboLabel->setBuddy(m_toolbarCombo);
911 m_widget, SLOT(slotToolBarSelected(
int)));
922 m_inactiveList =
new ToolBarListWidget(m_widget);
923 m_inactiveList->setDragEnabled(
true);
924 m_inactiveList->setActiveList(
false);
925 m_inactiveList->setMinimumSize(180, 250);
926 m_inactiveList->setDropIndicatorShown(
false);
927 inactive_label->
setBuddy(m_inactiveList);
929 m_widget, SLOT(slotInactiveSelectionChanged()));
931 m_widget, SLOT(slotInsertButton()));
932 QObject::connect(m_inactiveList, SIGNAL(dropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)),
933 m_widget, SLOT(slotDropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)));
940 m_activeList =
new ToolBarListWidget(m_widget);
941 m_activeList->setDragEnabled(
true);
942 m_activeList->setActiveList(
true);
944 m_activeList->setMinimumSize(m_inactiveList->minimumWidth(), 100);
945 active_label->
setBuddy(m_activeList);
948 m_widget, SLOT(slotActiveSelectionChanged()));
950 m_widget, SLOT(slotRemoveButton()));
951 QObject::connect(m_activeList, SIGNAL(dropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)),
952 m_widget, SLOT(slotDropped(ToolBarListWidget*,
int,ToolBarItem*,
bool)));
959 m_changeIcon->setIcon(
KIcon(
"preferences-desktop-icons"));
961 m_hasKDialog = !kdialogExe.
isEmpty();
962 m_changeIcon->setEnabled(m_hasKDialog && m_activeList->currentItem());
965 m_widget, SLOT(slotChangeIcon()) );
968 m_changeIconText =
new KPushButton(
i18n(
"Change Te&xt..." ), m_widget);
969 m_changeIconText->setIcon(
KIcon(
"edit-rename"));
970 m_changeIconText->setEnabled(m_activeList->currentItem() != 0);
973 m_widget, SLOT(slotChangeIconText()) );
978 m_upAction->setIcon(
KIcon(
"go-up") );
979 m_upAction->setEnabled(
false);
980 m_upAction->setAutoRepeat(
true);
981 QObject::connect(m_upAction, SIGNAL(clicked()), m_widget, SLOT(slotUpButton()));
985 m_insertAction->setEnabled(
false);
986 QObject::connect(m_insertAction, SIGNAL(clicked()), m_widget, SLOT(slotInsertButton()));
990 m_removeAction->setEnabled(
false);
991 QObject::connect(m_removeAction, SIGNAL(clicked()), m_widget, SLOT(slotRemoveButton()));
994 m_downAction->setIcon(
KIcon(
"go-down") );
995 m_downAction->setEnabled(
false);
996 m_downAction->setAutoRepeat(
true);
997 QObject::connect(m_downAction, SIGNAL(clicked()), m_widget, SLOT(slotDownButton()));
999 m_helpArea =
new QLabel(m_widget);
1000 m_helpArea->setWordWrap(
true);
1022 button_layout->
addWidget(m_upAction, 1, 1);
1023 button_layout->
addWidget(m_removeAction, 2, 0);
1024 button_layout->
addWidget(m_insertAction, 2, 2);
1025 button_layout->
addWidget(m_downAction, 3, 1);
1028 inactive_layout->
addWidget(inactive_label);
1029 inactive_layout->
addWidget(inactiveListSearchLine);
1030 inactive_layout->
addWidget(m_inactiveList, 1);
1033 active_layout->
addWidget(activeListSearchLine);
1034 active_layout->
addWidget(m_activeList, 1);
1035 active_layout->
addLayout(changeIcon_layout);
1037 changeIcon_layout->
addWidget(m_changeIcon);
1039 changeIcon_layout->
addWidget(m_changeIconText);
1041 list_layout->
addLayout(inactive_layout);
1046 top_layout->
addWidget(m_comboSeparator);
1052 void KEditToolBarWidgetPrivate::loadToolBarCombo(
const QString& defaultToolBar )
1056 m_toolbarCombo->clear();
1058 int defaultToolBarId = -1;
1061 XmlDataList::const_iterator xit = m_xmlFiles.constBegin();
1062 for ( ; xit != m_xmlFiles.constEnd(); ++xit)
1067 if ( (*xit).type() == XmlData::Merged )
1072 for ( ; it != (*xit).barList().constEnd(); ++it)
1074 const QString text = (*xit).toolBarText( *it );
1075 m_toolbarCombo->addItem( text );
1076 const QString name = (*it).attribute(attrName);
1077 if (defaultToolBarId == -1 && name == defaultToolBar)
1078 defaultToolBarId = count;
1082 const bool showCombo = (count > 1);
1083 m_comboLabel->setVisible(showCombo);
1084 m_comboSeparator->setVisible(showCombo);
1085 m_toolbarCombo->setVisible(showCombo);
1086 if (defaultToolBarId == -1)
1087 defaultToolBarId = 0;
1089 m_toolbarCombo->setCurrentIndex(defaultToolBarId);
1090 slotToolBarSelected(m_toolbarCombo->currentIndex());
1093 void KEditToolBarWidgetPrivate::loadActions(
const QDomElement& elem)
1102 QString sep_name(
"separator_%1");
1105 m_inactiveList->clear();
1106 m_activeList->clear();
1107 m_insertAction->setEnabled(
false);
1108 m_removeAction->setEnabled(
false);
1109 m_upAction->setEnabled(
false);
1110 m_downAction->setEnabled(
false);
1126 if (it.
isNull())
continue;
1127 if (it.
tagName() == tagSeparator)
1129 ToolBarItem *act =
new ToolBarItem(m_activeList, tagSeparator, sep_name.arg(sep_num++),
QString());
1130 act->setSeparator(
true);
1140 ToolBarItem *act =
new ToolBarItem(m_activeList, tagMerge, name,
i18n(
"This element will be replaced with all the elements of an embedded component."));
1142 act->setText(
i18n(
"<Merge>"));
1144 act->setText(
i18n(
"<Merge %1>", name));
1148 if (it.
tagName() == tagActionList)
1150 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.") );
1151 act->setText(
i18n(
"ActionList: %1", it.
attribute(attrName)));
1166 act->setIcon(!action->
icon().isNull() ? action->
icon() : m_emptyIcon);
1167 act->setTextAlongsideIconHidden(action->
priority() < QAction::NormalPriority);
1182 ToolBarItem *act =
new ToolBarItem(m_inactiveList, tagAction, action->
objectName(), action->
toolTip());
1184 act->setIcon(!action->
icon().isNull() ? action->
icon() : m_emptyIcon);
1187 m_inactiveList->sortItems(Qt::AscendingOrder);
1190 ToolBarItem *act =
new ToolBarItem(0L, tagSeparator, sep_name.arg(sep_num++),
QString());
1191 act->setSeparator(
true);
1193 m_inactiveList->insertItem(0, act);
1198 return d->m_collection;
1201 void KEditToolBarWidgetPrivate::slotToolBarSelected(
int index)
1207 int toolbarNumber = 0;
1208 XmlDataList::iterator xit = m_xmlFiles.begin();
1209 for ( ; xit != m_xmlFiles.end(); ++xit) {
1213 if ( (*xit).type() == XmlData::Merged )
1218 for ( ; it != (*xit).barList().end(); ++it) {
1221 if (toolbarNumber == index) {
1224 m_currentXmlData = & (*xit);
1225 m_currentToolBarElem = *it;
1227 kDebug() <<
"found toolbar" << m_currentXmlData->toolBarText(*it) <<
"m_currentXmlData set to";
1228 m_currentXmlData->dump();
1231 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1234 loadActions(m_currentToolBarElem);
1236 if ((*xit).type() == XmlData::Part || (*xit).type() == XmlData::Shell)
1237 m_widget->setDOMDocument( (*xit).domDocument() );
1246 void KEditToolBarWidgetPrivate::slotInactiveSelectionChanged()
1248 if (m_inactiveList->selectedItems().count())
1250 m_insertAction->setEnabled(
true);
1251 QString statusText =
static_cast<ToolBarItem*
>(m_inactiveList->selectedItems().first())->statusText();
1252 m_helpArea->setText(
i18nc(
"@label Action tooltip in toolbar editor, below the action list",
"%1", statusText) );
1256 m_insertAction->setEnabled(
false);
1257 m_helpArea->setText(
QString() );
1261 void KEditToolBarWidgetPrivate::slotActiveSelectionChanged()
1263 ToolBarItem* toolitem = 0;
1264 if (!m_activeList->selectedItems().isEmpty())
1265 toolitem = static_cast<ToolBarItem *>(m_activeList->selectedItems().first());
1267 m_removeAction->setEnabled( toolitem );
1269 m_changeIcon->setEnabled( toolitem &&
1271 toolitem->internalTag() ==
"Action" );
1273 m_changeIconText->setEnabled( toolitem &&
1274 toolitem->internalTag() ==
"Action" );
1278 m_upAction->setEnabled(toolitem->index() != 0);
1279 m_downAction->setEnabled(toolitem->index() != toolitem->listWidget()->count() - 1);
1281 QString statusText = toolitem->statusText();
1282 m_helpArea->setText(
i18nc(
"@label Action tooltip in toolbar editor, below the action list",
"%1", statusText) );
1286 m_upAction->setEnabled(
false);
1287 m_downAction->setEnabled(
false);
1288 m_helpArea->setText(
QString() );
1292 void KEditToolBarWidgetPrivate::slotInsertButton()
1294 QString internalName =
static_cast<ToolBarItem *
>(m_inactiveList->currentItem())->internalName();
1296 insertActive(m_inactiveList->currentItem(), m_activeList->currentItem(),
false);
1298 emit m_widget->enableOk(
true);
1300 slotToolBarSelected( m_toolbarCombo->currentIndex() );
1302 selectActiveItem( internalName );
1305 void KEditToolBarWidgetPrivate::selectActiveItem(
const QString& internalName)
1307 int activeItemCount = m_activeList->count();
1308 for(
int i = 0; i < activeItemCount; i++)
1310 ToolBarItem * item =
static_cast<ToolBarItem *
>(m_activeList->item(i));
1311 if (item->internalName()==internalName)
1313 m_activeList->setCurrentItem(item);
1319 void KEditToolBarWidgetPrivate::slotRemoveButton()
1321 removeActive( m_activeList->currentItem() );
1323 slotToolBarSelected( m_toolbarCombo->currentIndex() );
1326 void KEditToolBarWidgetPrivate::insertActive(ToolBarItem *item, ToolBarItem *before,
bool prepend)
1338 if (item->isSeparator())
1339 new_item = m_widget->domDocument().createElement(tagSeparator);
1341 new_item = m_widget->domDocument().createElement(tagAction);
1345 Q_ASSERT(!m_currentToolBarElem.isNull());
1351 QDomElement elem = findElementForToolBarItem( before );
1352 Q_ASSERT( !elem.
isNull() );
1353 m_currentToolBarElem.insertAfter(new_item, elem);
1359 m_currentToolBarElem.insertBefore(new_item, m_currentToolBarElem.
firstChild());
1361 m_currentToolBarElem.appendChild(new_item);
1365 m_currentToolBarElem.setAttribute( attrNoMerge,
"1");
1368 updateLocal(m_currentToolBarElem);
1371 void KEditToolBarWidgetPrivate::removeActive(ToolBarItem *item)
1379 emit m_widget->enableOk(
true);
1382 QDomElement elem = findElementForToolBarItem( item );
1386 m_currentToolBarElem.removeChild(elem);
1389 m_currentToolBarElem.setAttribute( attrNoMerge,
"1");
1392 updateLocal(m_currentToolBarElem);
1396 void KEditToolBarWidgetPrivate::slotUpButton()
1398 ToolBarItem *item = m_activeList->currentItem();
1405 int row = item->listWidget()->row(item) - 1;
1413 emit m_widget->enableOk(
true);
1415 moveActive( item, static_cast<ToolBarItem*>(item->listWidget()->item(row - 1)) );
1418 void KEditToolBarWidgetPrivate::moveActive( ToolBarItem* item, ToolBarItem* before )
1420 QDomElement e = findElementForToolBarItem( item );
1426 m_activeList->takeItem(m_activeList->row(item));
1429 m_activeList->insertItem(m_activeList->row(before) + 1, item);
1432 m_activeList->setCurrentItem(item);
1436 m_currentToolBarElem.insertBefore(e, m_currentToolBarElem.
firstChild() );
1438 m_currentToolBarElem.insertAfter(e, findElementForToolBarItem( (ToolBarItem*)before ));
1442 m_currentToolBarElem.setAttribute( attrNoMerge,
"1");
1445 updateLocal(m_currentToolBarElem);
1448 void KEditToolBarWidgetPrivate::slotDownButton()
1450 ToolBarItem *item = m_activeList->currentItem();
1458 int newRow = item->listWidget()->row(item) + 1;
1459 if (newRow >= item->listWidget()->count()) {
1465 emit m_widget->enableOk(
true);
1467 moveActive( item, static_cast<ToolBarItem*>(item->listWidget()->item(newRow)) );
1470 void KEditToolBarWidgetPrivate::updateLocal(
QDomElement& elem)
1474 XmlDataList::Iterator xit = m_xmlFiles.begin();
1475 for ( ; xit != m_xmlFiles.end(); ++xit)
1477 if ( (*xit).type() == XmlData::Merged )
1480 if ( (*xit).type() == XmlData::Shell ||
1481 (*xit).type() == XmlData::Part )
1483 if ( m_currentXmlData->xmlFile() == (*xit).xmlFile() )
1485 (*xit).m_isModified =
true;
1492 (*xit).m_isModified =
true;
1495 for ( ; it != (*xit).barList().end(); ++it)
1498 QString tag( (*it).tagName() );
1509 Q_ASSERT(!toolbar.
isNull());
1514 void KEditToolBarWidgetPrivate::slotChangeIcon()
1522 if ( m_kdialogProcess && m_kdialogProcess->state() == QProcess::Running )
1525 m_currentXmlData->dump();
1526 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1530 (*m_kdialogProcess) << kdialogExe;
1531 (*m_kdialogProcess) <<
"--caption";
1532 (*m_kdialogProcess) <<
i18n(
"Change Icon" );
1533 (*m_kdialogProcess) <<
"--embed";
1534 (*m_kdialogProcess) <<
QString::number( (quintptr)m_widget->window()->winId() );
1535 (*m_kdialogProcess) <<
"--geticon";
1536 (*m_kdialogProcess) <<
"Toolbar";
1537 (*m_kdialogProcess) <<
"Actions";
1539 m_kdialogProcess->setNextOpenMode( QIODevice::ReadOnly | QIODevice::Text );
1540 m_kdialogProcess->start();
1541 if ( !m_kdialogProcess->waitForStarted() ) {
1542 kError(240) <<
"Can't run " << kdialogExe << endl;
1543 delete m_kdialogProcess;
1544 m_kdialogProcess = 0;
1548 m_activeList->setEnabled(
false );
1549 m_toolbarCombo->setEnabled(
false );
1551 QObject::connect( m_kdialogProcess, SIGNAL(finished(
int,QProcess::ExitStatus)),
1552 m_widget, SLOT(slotProcessExited()) );
1555 void KEditToolBarWidgetPrivate::slotChangeIconText()
1557 m_currentXmlData->dump();
1558 ToolBarItem *item = m_activeList->currentItem();
1561 QString iconText = item->text();
1562 bool hidden = item->isTextAlongsideIconHidden();
1564 IconTextEditDialog dialog(m_widget);
1565 dialog.setIconText(iconText);
1566 dialog.setTextAlongsideIconHidden(hidden);
1568 bool ok = dialog.exec() == KDialog::Accepted;
1569 iconText = dialog.iconText();
1570 hidden = dialog.textAlongsideIconHidden();
1572 bool hiddenChanged = hidden != item->isTextAlongsideIconHidden();
1573 bool iconTextChanged = iconText != item->text();
1575 if (!ok || (!hiddenChanged && !iconTextChanged))
1578 item->setText(iconText);
1579 item->setTextAlongsideIconHidden(hidden);
1581 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1583 m_currentXmlData->m_isModified =
true;
1589 Q_ASSERT( !act_elem.isNull() );
1590 if (iconTextChanged)
1593 act_elem.setAttribute(
"priority", hidden ? QAction::LowPriority : QAction::NormalPriority );
1596 emit m_widget->enableOk(
true);
1600 void KEditToolBarWidgetPrivate::slotProcessExited()
1602 m_activeList->setEnabled(
true );
1603 m_toolbarCombo->setEnabled(
true );
1607 if (!m_kdialogProcess) {
1608 kError(240) <<
"Something is wrong here! m_kdialogProcess is zero!" << endl;
1613 icon = icon.
left( icon.indexOf(
'\n' ) );
1614 kDebug(240) <<
"icon=" << icon;
1615 if ( m_kdialogProcess->exitStatus() != QProcess::NormalExit ||
1617 delete m_kdialogProcess;
1618 m_kdialogProcess = 0;
1622 ToolBarItem *item = m_activeList->currentItem();
1625 item->setIcon(
KIcon(icon));
1627 Q_ASSERT( m_currentXmlData->type() != XmlData::Merged );
1629 m_currentXmlData->m_isModified =
true;
1635 Q_ASSERT( !act_elem.isNull() );
1639 emit m_widget->enableOk(
true);
1642 delete m_kdialogProcess;
1643 m_kdialogProcess = 0;
1646 void KEditToolBarWidgetPrivate::slotDropped(ToolBarListWidget* list,
int index, ToolBarItem* item,
bool sourceIsActiveList)
1650 if (list == m_activeList) {
1651 ToolBarItem* after = index > 0 ?
static_cast<ToolBarItem *
>(list->item(index-1)) : 0;
1653 if (sourceIsActiveList) {
1655 moveActive(item, after);
1658 insertActive(item, after,
true);
1660 }
else if (list == m_inactiveList) {
1668 emit m_widget->enableOk(
true);
1670 slotToolBarSelected( m_toolbarCombo->currentIndex() );
1678 if ( d->m_factory ) {
1680 d->m_widget->load( d->m_factory, d->m_defaultToolBar );
1683 d->m_widget->load( d->m_file, d->m_global, d->m_defaultToolBar );
1699 #include "kedittoolbar.moc"
1700 #include "kedittoolbar_p.moc"
QString i18n(const char *text)
A container for a set of QAction objects.
void setShortcutContext(Qt::ShortcutContext context)
QDomNode item(int index) const
virtual KActionCollection * actionCollection() const
Retrieves the entire action collection for the GUI client.
A KXMLGUIClient can be used with KXMLGUIFactory to create a GUI from actions and an XML document...
QDomNode appendChild(const QDomNode &newChild)
QString attribute(const QString &name, const QString &defValue) const
Show Cancel-button. (this button reject()s the dialog; result set to QDialog::Rejected) ...
QString label(StandardShortcut id)
Returns a localized label for user-visible display.
#define K_GLOBAL_STATIC(TYPE, NAME)
void loadStandardsXmlFile()
Load the ui_standards.rc file.
const char * name(StandardAction id)
This will return the internal name of a given standard action.
static QDebug kError(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
virtual void setXMLFile(const QString &file, bool merge=false, bool setXMLDoc=true)
Sets the name of the rc file containing the XML for the part.
QList< XmlData > XmlDataList
A dialog base class with standard buttons and predefined layouts.
virtual QString xmlFile() const
This will return the name of the XML file as set by setXMLFile().
const_iterator insert(const T &value)
virtual QString localXMLFile() const
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
void setSpacing(int spacing)
QString i18nc(const char *ctxt, const char *text)
QDomNode nextSibling() const
void setBuddy(QWidget *buddy)
QDomElement toElement() const
Standard horizontal or vertical separator.
QString number(int n, int base)
int count(const T &value) const
QString fromLocal8Bit(const char *str, int size)
void append(const T &value)
void setRowStretch(int row, int stretch)
void setAttribute(const QString &name, const QString &value)
An abstract class for GUI data such as ToolTip and Icon.
static QString readConfigFile(const QString &filename, const KComponentData &componentData=KComponentData())
QList< QAction * > actions() const
Returns the list of KActions which belong to this action collection.
A wrapper around QIcon that provides KDE icon features.
void setMargin(int margin)
static QDataStream & operator>>(QDataStream &s, ToolBarItem &item)
QByteArray & append(char ch)
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted) ...
QDomNode namedItem(const QString &name) const
KXMLGUIFactory, together with KXMLGUIClient objects, can be used to create a GUI of container widgets...
bool isRelativePath(const QString &path)
KGuiItem ok()
Returns the 'Ok' gui item.
bool contains(const T &value) const
QString removeAcceleratorMarker(const QString &label) const
An enhanced QLineEdit widget for inputting text.
QDomNode firstChild() const
QTestData & newRow(const char *dataTag)
void addStretch(int stretch)
QDomNode replaceChild(const QDomNode &newChild, const QDomNode &oldChild)
static QString locateLocal(const char *type, const QString &filename, const KComponentData &cData=KGlobal::mainComponent())
QDomNode cloneNode(bool deep) const
KLocalizedString ki18nc(const char *ctxt, const char *msg)
virtual void hideEvent(QHideEvent *)
Emits the hidden signal.
static QString findExe(const QString &appname, const QString &pathstr=QString(), SearchOptions options=NoSearchOptions)
const KComponentData & mainComponent()
virtual void showEvent(QShowEvent *event)
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
QString left(int n) const
KLocalizedString subs(int a, int fieldWidth=0, int base=10, const QChar &fillChar=QLatin1Char(' ')) const
QString fromLatin1(const char *str, int size)
virtual QDomDocument domDocument() const
void setFlags(CrashFlags flags)
Set options to determine how the default crash handler should behave.
void setClickMessage(const QString &msg)
This makes the line edit display a grayed-out hinting text as long as the user didn't enter any text...
void setData(const QString &mimeType, const QByteArray &data)
const QString & staticQString(const char *str)
QList< KXMLGUIClient * > clients() const
Returns a list of all clients currently added to this factory.
static QDataStream & operator<<(QDataStream &s, const ToolBarItem &item)
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KAction * save(const QObject *recvr, const char *slot, QObject *parent)
Save the current document.
static bool saveConfigFile(const QDomDocument &doc, const QString &filename, const KComponentData &componentData=KComponentData())
static ToolBarList findToolBars(const QDomElement &start)
Return a list of toolbar elements given a toplevel element.
static int warningContinueCancel(QWidget *parent, const QString &text, const QString &caption=QString(), const KGuiItem &buttonContinue=KStandardGuiItem::cont(), const KGuiItem &buttonCancel=KStandardGuiItem::cancel(), const QString &dontAskAgainName=QString(), Options options=Notify)
Display a "warning" dialog.
static QDomElement actionPropertiesElement(QDomDocument &doc)
QDomDocument toDocument() const
static QDomElement findActionByName(QDomElement &elem, const QString &sName, bool create)
void addLayout(QLayout *layout, int stretch)
bool setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
void setXMLGUIBuildDocument(const QDomDocument &doc)
QByteArray toUtf8() const