19 #include <kedittoolbar.h>
26 #include <tqcombobox.h>
27 #include <tqdragobject.h>
28 #include <tqtoolbutton.h>
30 #include <tqvaluelist.h>
31 #include <tqapplication.h>
32 #include <tqtextstream.h>
35 #include <kstandarddirs.h>
37 #include <kicontheme.h>
38 #include <kiconloader.h>
39 #include <kinstance.h>
40 #include <kmessagebox.h>
41 #include <kxmlguifactory.h>
42 #include <kseparator.h>
44 #include <klistview.h>
46 #include <kpushbutton.h>
49 static const char *
const lineseparatorstring =
I18N_NOOP(
"--- line separator ---");
50 static const char *
const separatorstring =
I18N_NOOP(
"--- separator ---");
52 #define LINESEPARATORSTRING i18n(lineseparatorstring)
53 #define SEPARATORSTRING i18n(separatorstring)
55 static void dump_xml(
const TQDomDocument& doc)
58 TQTextStream ts(&str, IO_WriteOnly);
63 typedef TQValueList<TQDomElement> ToolbarList;
70 enum XmlType { Shell = 0, Part, Local, Merged };
74 m_actionCollection = 0;
78 TQDomDocument m_document;
83 ToolbarList m_barList;
86 typedef TQValueList<XmlData> XmlDataList;
88 class ToolbarItem :
public TQListViewItem
91 ToolbarItem(
KListView *parent,
const TQString& tag = TQString::null,
const TQString& name = TQString::null,
const TQString& statusText = TQString::null)
92 : TQListViewItem(parent),
95 m_statusText(statusText)
99 ToolbarItem(
KListView *parent, TQListViewItem *item,
const TQString &tag = TQString::null,
const TQString& name = TQString::null,
const TQString& statusText = TQString::null)
100 : TQListViewItem(parent, item),
103 m_statusText(statusText)
107 virtual TQString
key(
int column,
bool)
const
109 TQString s = text( column );
110 if ( s == LINESEPARATORSTRING )
112 if ( s == SEPARATORSTRING )
117 void setInternalTag(
const TQString &tag) { m_tag = tag; }
118 void setInternalName(
const TQString &name) { m_name = name; }
119 void setStatusText(
const TQString &text) { m_statusText = text; }
120 TQString internalTag()
const {
return m_tag; }
121 TQString internalName()
const {
return m_name; }
122 TQString statusText()
const {
return m_statusText; }
126 TQString m_statusText;
129 #define TOOLBARITEMMIMETYPE "data/x-kde.toolbar.item"
130 class ToolbarItemDrag :
public TQStoredDrag
133 ToolbarItemDrag(ToolbarItem *toolbarItem,
134 TQWidget *dragSource = 0,
const char *name = 0)
135 : TQStoredDrag( TOOLBARITEMMIMETYPE, dragSource,
name )
139 TQDataStream out(data, IO_WriteOnly);
140 out << toolbarItem->internalTag();
141 out << toolbarItem->internalName();
142 out << toolbarItem->statusText();
143 out << toolbarItem->text(1);
144 setEncodedData(data);
148 static bool canDecode(TQMimeSource* e)
150 return e->provides(TOOLBARITEMMIMETYPE);
153 static bool decode(
const TQMimeSource* e, ToolbarItem& item )
158 TQByteArray data = e->encodedData(TOOLBARITEMMIMETYPE);
159 if ( data.isEmpty() )
162 TQString internalTag, internalName, statusText, text;
163 TQDataStream in(data, IO_ReadOnly);
169 item.setInternalTag( internalTag );
170 item.setInternalName( internalName );
171 item.setStatusText( statusText );
172 item.setText(1, text);
181 ToolbarListView(TQWidget *parent=0,
const char *name=0)
188 ToolbarItem *item =
dynamic_cast<ToolbarItem*
>(selectedItem());
190 ToolbarItemDrag *obj =
new ToolbarItemDrag(item,
191 this,
"ToolbarAction drag item");
192 const TQPixmap *pm = item->pixmap(0);
194 obj->setPixmap( *pm );
200 virtual bool acceptDrag(TQDropEvent *event)
const
202 return ToolbarItemDrag::canDecode( event );
207 class KEditToolbarWidgetPrivate
218 : m_collection( collection )
220 m_instance = instance;
223 m_kdialogProcess = 0;
225 ~KEditToolbarWidgetPrivate()
229 TQString xmlFile(
const TQString& xml_file)
231 return xml_file.isNull() ? TQString(m_instance->instanceName()) +
"ui.rc" :
238 TQString loadXMLFile(
const TQString& _xml_file)
241 TQString xml_file = xmlFile(_xml_file);
244 if ( !TQDir::isRelativePath(xml_file) )
245 raw_xml = KXMLGUIFactory::readConfigFile(xml_file);
247 raw_xml = KXMLGUIFactory::readConfigFile(xml_file, m_instance);
255 ToolbarList findToolbars(TQDomNode n)
261 for( ; !n.isNull(); n = n.nextSibling() )
263 TQDomElement elem = n.toElement();
267 if (elem.tagName() == tagToolbar && elem.attribute( attrNoEdit ) !=
"true" )
270 list += findToolbars(elem.firstChild());
279 TQString toolbarName(
const XmlData& xmlData,
const TQDomElement& it )
const
286 TQCString txt( it.namedItem( tagText ).toElement().text().utf8() );
288 txt = it.namedItem( tagText2 ).toElement().text().utf8();
290 name = it.attribute( attrName );
296 if ( ( xmlData.m_type == XmlData::Shell ) ||
297 ( xmlData.m_type == XmlData::Part ) )
299 TQString doc_name(xmlData.m_document.documentElement().attribute( attrName ));
300 name +=
" <" + doc_name +
">";
307 TQDomElement findElementForToolbarItem(
const ToolbarItem* item )
const
310 for(TQDomNode n = m_currentToolbarElem.firstChild(); !n.isNull(); n = n.nextSibling())
312 TQDomElement elem = n.toElement();
313 if ((elem.attribute(attrName) == item->internalName()) &&
314 (elem.tagName() == item->internalTag()))
317 return TQDomElement();
323 static const char* s_XmlTypeToString[] = {
"Shell",
"Part",
"Local",
"Merged" };
324 XmlDataList::Iterator xit = m_xmlFiles.begin();
325 for ( ; xit != m_xmlFiles.end(); ++xit )
327 kdDebug(240) <<
"XmlData type " << s_XmlTypeToString[(*xit).m_type] <<
" xmlFile: " << (*xit).m_xmlFile <<
endl;
328 for( TQValueList<TQDomElement>::Iterator it = (*xit).m_barList.begin();
329 it != (*xit).m_barList.end(); ++it ) {
330 kdDebug(240) <<
" Toolbar: " << toolbarName( *xit, *it ) <<
endl;
332 if ( (*xit).m_actionCollection )
333 kdDebug(240) <<
" " << (*xit).m_actionCollection->count() <<
" actions in the collection." <<
endl;
344 XmlData* m_currentXmlData;
345 TQDomElement m_currentToolbarElem;
348 TQString m_globalFile;
350 TQDomDocument m_localDoc;
353 ToolbarList m_barList;
355 XmlDataList m_xmlFiles;
357 TQLabel *m_comboLabel;
359 TQLabel * m_helpArea;
365 class KEditToolbarPrivate {
376 const char *KEditToolbar::s_defaultToolbar = 0L;
379 bool global, TQWidget* parent,
const char* name)
380 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Default|Ok|Apply|Cancel, Ok, parent, name),
381 m_widget(new
KEditToolbarWidget(TQString::fromLatin1(s_defaultToolbar), collection, file, global, this))
384 d->m_global = global;
385 d->m_collection = collection;
390 const TQString& file,
bool global,
391 TQWidget* parent,
const char* name)
392 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Default|Ok|Apply|Cancel, Ok, parent, name),
396 d->m_global = global;
397 d->m_collection = collection;
402 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Default|Ok|Apply|Cancel, Ok, parent, name),
403 m_widget(new
KEditToolbarWidget(TQString::fromLatin1(s_defaultToolbar), factory, this))
406 d->m_factory = factory;
410 TQWidget* parent,
const char* name)
411 :
KDialogBase(Swallow, i18n(
"Configure Toolbars"), Default|Ok|Apply|Cancel, Ok, parent, name),
415 d->m_factory = factory;
418 void KEditToolbar::init()
420 d =
new KEditToolbarPrivate();
426 connect(m_widget, TQT_SIGNAL(enableOk(
bool)), TQT_SLOT(
acceptOK(
bool)));
427 connect(m_widget, TQT_SIGNAL(enableOk(
bool)), TQT_SLOT(
enableButtonApply(
bool)));
430 setMinimumSize(sizeHint());
431 s_defaultToolbar = 0L;
447 if (
KMessageBox::warningContinueCancel(
this, i18n(
"Do you really want to reset all toolbars of this application to their default? The changes will be applied immediately."), i18n(
"Reset Toolbars"),i18n(
"Reset"))!=KMessageBox::Continue )
455 const TQString localPrefix =
locateLocal(
"data",
"");
456 TQPtrList<KXMLGUIClient> clients(d->m_factory->clients());
457 TQPtrListIterator<KXMLGUIClient> it( clients );
459 for( ; it.current(); ++it)
462 TQString file = client->
xmlFile();
467 if (TQDir::isRelativePath(file))
470 file =
locateLocal(
"data", TQString::fromLatin1( instance->instanceName() +
'/' ) + file);
474 if (!file.startsWith(localPrefix))
478 if ( TQFile::exists( file ) )
479 if ( !TQFile::remove( file ) )
488 int slash = d->m_file.findRev(
'/')+1;
490 d->m_file = d->m_file.mid(slash);
493 if ( TQFile::exists( xml_file ) )
494 if ( !TQFile::remove( xml_file ) )
497 m_widget =
new KEditToolbarWidget(TQString::null, d->m_collection, d->m_file, d->m_global,
this);
503 connect(m_widget, TQT_SIGNAL(enableOk(
bool)), TQT_SLOT(
acceptOK(
bool)));
504 connect(m_widget, TQT_SIGNAL(enableOk(
bool)), TQT_SLOT(
enableButtonApply(
bool)));
517 if (!m_widget->
save())
530 (void)m_widget->
save();
537 s_defaultToolbar = toolbarName;
541 const TQString& file,
542 bool global, TQWidget *parent)
544 d(new KEditToolbarWidgetPrivate(instance(), collection))
546 initNonKPart(collection, file, global);
550 setMinimumSize(sizeHint());
555 const TQString& file,
bool global,
558 d(new KEditToolbarWidgetPrivate(instance(), collection))
560 initNonKPart(collection, file, global);
562 loadToolbarCombo(defaultToolbar);
564 setMinimumSize(sizeHint());
570 d(new KEditToolbarWidgetPrivate(instance(),
KXMLGUIClient::actionCollection() ))
576 setMinimumSize(sizeHint());
583 d(new KEditToolbarWidgetPrivate(instance(),
KXMLGUIClient::actionCollection() ))
587 loadToolbarCombo(defaultToolbar);
589 setMinimumSize(sizeHint());
598 const TQString& file,
bool global)
605 TQString localXML = d->loadXMLFile(file);
613 local.m_xmlFile = d->xmlFile(file);
614 local.m_type = XmlData::Local;
615 local.m_document.setContent(localXML);
616 elem = local.m_document.documentElement().toElement();
617 local.m_barList = d->findToolbars(elem);
618 local.m_actionCollection = collection;
619 d->m_xmlFiles.append(local);
623 merge.m_xmlFile = TQString::null;
624 merge.m_type = XmlData::Merged;
626 elem = merge.m_document.documentElement().toElement();
627 merge.m_barList = d->findToolbars(elem);
628 merge.m_actionCollection = collection;
629 d->m_xmlFiles.append(merge);
648 TQPtrList<KXMLGUIClient> clients(factory->
clients());
649 TQPtrListIterator<KXMLGUIClient> it( clients );
650 for( ; it.current(); ++it)
654 if (client->
xmlFile().isNull())
658 data.m_xmlFile = client->localXMLFile();
660 data.m_type = XmlData::Shell;
662 data.m_type = XmlData::Part;
663 data.m_document.setContent( KXMLGUIFactory::readConfigFile( client->
xmlFile(), client->
instance() ) );
664 elem = data.m_document.documentElement().toElement();
665 data.m_barList = d->findToolbars(elem);
667 d->m_xmlFiles.append(data);
683 XmlDataList::Iterator it = d->m_xmlFiles.begin();
684 for ( ; it != d->m_xmlFiles.end(); ++it)
687 if ( !((*it).m_isModified) )
691 if ( (*it).m_type == XmlData::Merged )
694 dump_xml((*it).m_document);
696 kdDebug(240) <<
"Saving " << (*it).m_xmlFile <<
endl;
698 KXMLGUIFactory::saveConfigFile((*it).m_document, (*it).m_xmlFile);
714 TQPtrList<KXMLGUIClient> clients(
factory()->clients());
723 client = clients.prev();
730 TQPtrListIterator<KXMLGUIClient> cit( clients );
731 for( ; cit.current(); ++cit)
735 TQString file( client->
xmlFile() );
736 if ( !file.isEmpty() )
742 if ( client == firstClient )
746 client->
setXMLFile( file, client == firstClient );
754 for( ; cit.current(); ++cit)
758 void KEditToolbarWidget::setupLayout()
761 d->m_comboLabel =
new TQLabel(i18n(
"&Toolbar:"),
this);
762 m_toolbarCombo =
new TQComboBox(
this);
763 m_toolbarCombo->setEnabled(
false);
764 d->m_comboLabel->setBuddy(m_toolbarCombo);
766 connect(m_toolbarCombo, TQT_SIGNAL(activated(
const TQString&)),
767 this, TQT_SLOT(slotToolbarSelected(
const TQString&)));
777 TQLabel *inactive_label =
new TQLabel(i18n(
"A&vailable actions:"),
this);
778 m_inactiveList =
new ToolbarListView(
this);
779 m_inactiveList->setDragEnabled(
true);
780 m_inactiveList->setAcceptDrops(
true);
781 m_inactiveList->setDropVisualizer(
false);
782 m_inactiveList->setAllColumnsShowFocus(
true);
783 m_inactiveList->setMinimumSize(180, 250);
784 m_inactiveList->header()->hide();
785 m_inactiveList->addColumn(
"");
786 int column2 = m_inactiveList->addColumn(
"");
787 m_inactiveList->setSorting( column2 );
788 inactive_label->setBuddy(m_inactiveList);
789 connect(m_inactiveList, TQT_SIGNAL(selectionChanged(TQListViewItem *)),
790 this, TQT_SLOT(slotInactiveSelected(TQListViewItem *)));
791 connect(m_inactiveList, TQT_SIGNAL( doubleClicked( TQListViewItem *,
const TQPoint &,
int )),
792 this, TQT_SLOT(slotInsertButton()));
795 TQLabel *active_label =
new TQLabel(i18n(
"Curr&ent actions:"),
this);
796 m_activeList =
new ToolbarListView(
this);
797 m_activeList->setDragEnabled(
true);
798 m_activeList->setAcceptDrops(
true);
799 m_activeList->setDropVisualizer(
true);
800 m_activeList->setAllColumnsShowFocus(
true);
801 m_activeList->setMinimumWidth(m_inactiveList->minimumWidth());
802 m_activeList->header()->hide();
803 m_activeList->addColumn(
"");
804 m_activeList->addColumn(
"");
805 m_activeList->setSorting(-1);
806 active_label->setBuddy(m_activeList);
808 connect(m_inactiveList, TQT_SIGNAL(dropped(
KListView*,TQDropEvent*,TQListViewItem*)),
809 this, TQT_SLOT(slotDropped(
KListView*,TQDropEvent*,TQListViewItem*)));
810 connect(m_activeList, TQT_SIGNAL(dropped(
KListView*,TQDropEvent*,TQListViewItem*)),
811 this, TQT_SLOT(slotDropped(
KListView*,TQDropEvent*,TQListViewItem*)));
812 connect(m_activeList, TQT_SIGNAL(selectionChanged(TQListViewItem *)),
813 this, TQT_SLOT(slotActiveSelected(TQListViewItem *)));
814 connect(m_activeList, TQT_SIGNAL( doubleClicked( TQListViewItem *,
const TQPoint &,
int )),
815 this, TQT_SLOT(slotRemoveButton()));
818 d->m_changeIcon =
new KPushButton( i18n(
"Change &Icon..." ),
this );
820 d->m_hasKDialog = !kdialogExe.isEmpty();
821 d->m_changeIcon->setEnabled( d->m_hasKDialog );
823 connect( d->m_changeIcon, TQT_SIGNAL( clicked() ),
824 this, TQT_SLOT( slotChangeIcon() ) );
829 m_upAction =
new TQToolButton(
this);
830 iconSet = SmallIconSet(
"up" );
831 m_upAction->setIconSet( iconSet );
832 m_upAction->setEnabled(
false);
833 m_upAction->setAutoRepeat(
true);
834 connect(m_upAction, TQT_SIGNAL(clicked()), TQT_SLOT(slotUpButton()));
836 m_insertAction =
new TQToolButton(
this);
837 iconSet = TQApplication::reverseLayout() ? SmallIconSet(
"back" ) : SmallIconSet(
"forward" );
838 m_insertAction->setIconSet( iconSet );
839 m_insertAction->setEnabled(
false);
840 connect(m_insertAction, TQT_SIGNAL(clicked()), TQT_SLOT(slotInsertButton()));
842 m_removeAction =
new TQToolButton(
this);
843 iconSet = TQApplication::reverseLayout() ? SmallIconSet(
"forward" ) : SmallIconSet(
"back" );
844 m_removeAction->setIconSet( iconSet );
845 m_removeAction->setEnabled(
false);
846 connect(m_removeAction, TQT_SIGNAL(clicked()), TQT_SLOT(slotRemoveButton()));
848 m_downAction =
new TQToolButton(
this);
849 iconSet = SmallIconSet(
"down" );
850 m_downAction->setIconSet( iconSet );
851 m_downAction->setEnabled(
false);
852 m_downAction->setAutoRepeat(
true);
853 connect(m_downAction, TQT_SIGNAL(clicked()), TQT_SLOT(slotDownButton()));
855 d->m_helpArea =
new TQLabel(
this);
856 d->m_helpArea->setAlignment( TQt::WordBreak );
868 TQGridLayout *button_layout =
new TQGridLayout(5, 3, 0);
870 name_layout->addWidget(d->m_comboLabel);
871 name_layout->addWidget(m_toolbarCombo);
875 button_layout->setRowStretch( 0, 10 );
876 button_layout->addWidget(m_upAction, 1, 1);
877 button_layout->addWidget(m_removeAction, 2, 0);
878 button_layout->addWidget(m_insertAction, 2, 2);
879 button_layout->addWidget(m_downAction, 3, 1);
880 button_layout->setRowStretch( 4, 10 );
882 inactive_layout->addWidget(inactive_label);
883 inactive_layout->addWidget(m_inactiveList, 1);
885 active_layout->addWidget(active_label);
886 active_layout->addWidget(m_activeList, 1);
887 active_layout->addLayout(changeIcon_layout);
889 changeIcon_layout->addStretch( 1 );
890 changeIcon_layout->addWidget( d->m_changeIcon );
891 changeIcon_layout->addStretch( 1 );
893 list_layout->addLayout(inactive_layout);
894 list_layout->addLayout(TQT_TQLAYOUT(button_layout));
895 list_layout->addLayout(active_layout);
897 top_layout->addLayout(name_layout);
898 top_layout->addWidget(d->m_comboSeparator);
899 top_layout->addLayout(list_layout,10);
900 top_layout->addWidget(d->m_helpArea);
904 void KEditToolbarWidget::loadToolbarCombo(
const TQString& defaultToolbar)
908 m_toolbarCombo->clear();
910 int defaultToolbarId = -1;
913 XmlDataList::Iterator xit = d->m_xmlFiles.begin();
914 for ( ; xit != d->m_xmlFiles.end(); ++xit)
917 if ( (*xit).m_type == XmlData::Local )
921 ToolbarList::Iterator it = (*xit).m_barList.begin();
922 for ( ; it != (*xit).m_barList.end(); ++it)
924 TQString name = d->toolbarName( *xit, *it );
925 m_toolbarCombo->setEnabled(
true );
926 m_toolbarCombo->insertItem( name );
927 if (defaultToolbarId == -1 && (name == defaultToolbar || defaultToolbar == (*it).attribute( attrName )))
928 defaultToolbarId = count;
932 bool showCombo = (count > 1);
933 d->m_comboLabel->setShown(showCombo);
934 d->m_comboSeparator->setShown(showCombo);
935 m_toolbarCombo->setShown(showCombo);
936 if (defaultToolbarId == -1)
937 defaultToolbarId = 0;
939 m_toolbarCombo->setCurrentItem(defaultToolbarId);
940 slotToolbarSelected(m_toolbarCombo->currentText());
943 void KEditToolbarWidget::loadActionList(TQDomElement& elem)
952 TQString sep_name(
"separator_%1");
955 m_inactiveList->clear();
956 m_activeList->clear();
957 m_insertAction->setEnabled(
false);
958 m_removeAction->setEnabled(
false);
959 m_upAction->setEnabled(
false);
960 m_downAction->setEnabled(
false);
966 TQMap<TQString, bool> active_list;
970 TQDomNode n = elem.lastChild();
971 for( ; !n.isNull(); n = n.previousSibling() )
973 TQDomElement it = n.toElement();
974 if (it.isNull())
continue;
975 if (it.tagName() == tagSeparator)
977 ToolbarItem *act =
new ToolbarItem(m_activeList, tagSeparator, sep_name.arg(sep_num++), TQString::null);
978 bool isLineSep = ( it.attribute(attrLineSeparator,
"true").lower() == TQString::fromLatin1(
"true") );
980 act->setText(1, LINESEPARATORSTRING);
982 act->setText(1, SEPARATORSTRING);
983 it.setAttribute( attrName, act->internalName() );
987 if (it.tagName() == tagMerge)
990 TQString name = it.attribute( attrName );
991 ToolbarItem *act =
new ToolbarItem(m_activeList, tagMerge, name, i18n(
"This element will be replaced with all the elements of an embedded component."));
992 if ( name.isEmpty() )
993 act->setText(1, i18n(
"<Merge>"));
995 act->setText(1, i18n(
"<Merge %1>").arg(name));
999 if (it.tagName() == tagActionList)
1001 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.") );
1002 act->setText(1, i18n(
"ActionList: %1").arg(it.attribute(attrName)));
1009 for (
unsigned int i = 0; i < actionCollection->
count(); i++)
1014 if (it.attribute( attrName ) == action->name())
1017 ToolbarItem *act =
new ToolbarItem(m_activeList, it.tagName(), action->name(), action->toolTip());
1018 act->setText(1, action->plainText());
1019 if (action->hasIcon())
1020 if (!action->icon().isEmpty())
1025 active_list.insert(action->name(),
true);
1032 for (
int i = actionCollection->
count() - 1; i > -1; --i)
1037 if (active_list.contains(action->name()))
1040 ToolbarItem *act =
new ToolbarItem(m_inactiveList, tagActionList, action->name(), action->toolTip());
1041 act->setText(1, action->plainText());
1042 if (action->hasIcon())
1043 if (!action->icon().isEmpty())
1050 ToolbarItem *act =
new ToolbarItem(m_inactiveList, tagSeparator, sep_name.arg(sep_num++), TQString::null);
1051 act->setText(1, LINESEPARATORSTRING);
1052 act =
new ToolbarItem(m_inactiveList, tagSeparator, sep_name.arg(sep_num++), TQString::null);
1053 act->setText(1, SEPARATORSTRING);
1058 return d->m_collection;
1061 void KEditToolbarWidget::slotToolbarSelected(
const TQString& _text)
1064 XmlDataList::Iterator xit = d->m_xmlFiles.begin();
1065 for ( ; xit != d->m_xmlFiles.end(); ++xit)
1068 ToolbarList::Iterator it = (*xit).m_barList.begin();
1069 for ( ; it != (*xit).m_barList.end(); ++it)
1071 TQString name = d->toolbarName( *xit, *it );
1073 if ( name == _text )
1076 d->m_currentXmlData = & (*xit);
1077 d->m_currentToolbarElem = (*it);
1080 loadActionList(d->m_currentToolbarElem);
1082 if ((*xit).m_type == XmlData::Part || (*xit).m_type == XmlData::Shell)
1090 void KEditToolbarWidget::slotInactiveSelected(TQListViewItem *item)
1092 ToolbarItem* toolitem =
static_cast<ToolbarItem *
>(item);
1095 m_insertAction->setEnabled(
true);
1096 TQString statusText = toolitem->statusText();
1097 d->m_helpArea->setText( statusText );
1101 m_insertAction->setEnabled(
false);
1102 d->m_helpArea->setText( TQString::null );
1106 void KEditToolbarWidget::slotActiveSelected(TQListViewItem *item)
1108 ToolbarItem* toolitem =
static_cast<ToolbarItem *
>(item);
1109 m_removeAction->setEnabled( item );
1112 d->m_changeIcon->setEnabled( item &&
1114 toolitem->internalTag() == tagAction );
1118 if (item->itemAbove())
1119 m_upAction->setEnabled(
true);
1121 m_upAction->setEnabled(
false);
1123 if (item->itemBelow())
1124 m_downAction->setEnabled(
true);
1126 m_downAction->setEnabled(
false);
1127 TQString statusText = toolitem->statusText();
1128 d->m_helpArea->setText( statusText );
1132 m_upAction->setEnabled(
false);
1133 m_downAction->setEnabled(
false);
1134 d->m_helpArea->setText( TQString::null );
1138 void KEditToolbarWidget::slotDropped(
KListView *list, TQDropEvent *e, TQListViewItem *after)
1140 ToolbarItem *item =
new ToolbarItem(m_inactiveList);
1141 if(!ToolbarItemDrag::decode(e, *item)) {
1146 if (list == m_activeList) {
1147 if (e->source() == m_activeList) {
1149 moveActive(item, after);
1152 insertActive(item, after,
true);
1153 }
else if (list == m_inactiveList) {
1158 delete item; item = 0;
1163 slotToolbarSelected( m_toolbarCombo->currentText() );
1166 void KEditToolbarWidget::slotInsertButton()
1168 ToolbarItem *item = (ToolbarItem*)m_inactiveList->currentItem();
1169 insertActive(item, m_activeList->currentItem(),
false);
1176 slotToolbarSelected( m_toolbarCombo->currentText() );
1179 void KEditToolbarWidget::slotRemoveButton()
1181 removeActive( dynamic_cast<ToolbarItem*>(m_activeList->currentItem()) );
1186 slotToolbarSelected( m_toolbarCombo->currentText() );
1189 void KEditToolbarWidget::insertActive(ToolbarItem *item, TQListViewItem *before,
bool prepend)
1200 TQDomElement new_item;
1202 if (item->text(1) == LINESEPARATORSTRING) {
1203 new_item =
domDocument().createElement(tagSeparator);
1204 }
else if (item->text(1) == SEPARATORSTRING) {
1205 new_item =
domDocument().createElement(tagSeparator);
1206 new_item.setAttribute(attrLineSeparator,
"false");
1208 new_item =
domDocument().createElement(tagAction);
1209 new_item.setAttribute(attrName, item->internalName());
1215 ToolbarItem *act_item = (ToolbarItem*)before;
1216 TQDomElement elem = d->findElementForToolbarItem( act_item );
1217 Q_ASSERT( !elem.isNull() );
1218 d->m_currentToolbarElem.insertAfter(new_item, elem);
1224 d->m_currentToolbarElem.insertBefore(new_item, d->m_currentToolbarElem.firstChild());
1226 d->m_currentToolbarElem.appendChild(new_item);
1230 d->m_currentToolbarElem.setAttribute( attrNoMerge,
"1");
1233 updateLocal(d->m_currentToolbarElem);
1236 void KEditToolbarWidget::removeActive(ToolbarItem *item)
1247 TQDomElement elem = d->findElementForToolbarItem( item );
1248 if ( !elem.isNull() )
1251 d->m_currentToolbarElem.removeChild(elem);
1254 d->m_currentToolbarElem.setAttribute( attrNoMerge,
"1");
1257 updateLocal(d->m_currentToolbarElem);
1261 void KEditToolbarWidget::slotUpButton()
1263 ToolbarItem *item = (ToolbarItem*)m_activeList->currentItem();
1266 if (!item->itemAbove())
1272 moveActive( item, item->itemAbove()->itemAbove() );
1276 void KEditToolbarWidget::moveActive( ToolbarItem* item, TQListViewItem* before )
1278 TQDomElement e = d->findElementForToolbarItem( item );
1284 ToolbarItem *clone =
new ToolbarItem(m_activeList,
1286 item->internalTag(),
1287 item->internalName(),
1288 item->statusText());
1290 clone->setText(1, item->text(1));
1293 if( item->pixmap(0) )
1294 clone->setPixmap(0, *item->pixmap(0));
1297 m_activeList->setSelected(clone,
true);
1300 m_activeList->ensureItemVisible(clone);
1304 d->m_currentToolbarElem.insertBefore(e, d->m_currentToolbarElem.firstChild() );
1306 d->m_currentToolbarElem.insertAfter(e, d->findElementForToolbarItem( (ToolbarItem*)before ));
1310 d->m_currentToolbarElem.setAttribute( attrNoMerge,
"1");
1313 updateLocal(d->m_currentToolbarElem);
1316 void KEditToolbarWidget::slotDownButton()
1318 ToolbarItem *item = (ToolbarItem*)m_activeList->currentItem();
1321 if (!item->itemBelow())
1327 moveActive( item, item->itemBelow() );
1331 void KEditToolbarWidget::updateLocal(TQDomElement& elem)
1335 XmlDataList::Iterator xit = d->m_xmlFiles.begin();
1336 for ( ; xit != d->m_xmlFiles.end(); ++xit)
1338 if ( (*xit).m_type == XmlData::Merged )
1341 if ( (*xit).m_type == XmlData::Shell ||
1342 (*xit).m_type == XmlData::Part )
1344 if ( d->m_currentXmlData->m_xmlFile == (*xit).m_xmlFile )
1346 (*xit).m_isModified =
true;
1353 (*xit).m_isModified =
true;
1355 ToolbarList::Iterator it = (*xit).m_barList.begin();
1356 for ( ; it != (*xit).m_barList.end(); ++it)
1358 TQString name( (*it).attribute( attrName ) );
1359 TQString tag( (*it).tagName() );
1360 if ( (tag != elem.tagName()) || (name != elem.attribute(attrName)) )
1363 TQDomElement toolbar = (*xit).m_document.documentElement().toElement();
1364 toolbar.replaceChild(elem, (*it));
1369 TQDomElement toolbar = (*xit).m_document.documentElement().toElement();
1370 toolbar.appendChild(elem);
1374 void KEditToolbarWidget::slotChangeIcon()
1381 if ( d->m_kdialogProcess && d->m_kdialogProcess->isRunning() )
1384 d->m_kdialogProcess =
new KProcIO;
1386 (*d->m_kdialogProcess) << kdialogExe;
1387 (*d->m_kdialogProcess) <<
"--embed";
1388 (*d->m_kdialogProcess) << TQString::number( (ulong)topLevelWidget()->winId() );
1389 (*d->m_kdialogProcess) <<
"--geticon";
1390 (*d->m_kdialogProcess) <<
"Toolbar";
1391 (*d->m_kdialogProcess) <<
"Actions";
1393 kdError(240) <<
"Can't run " << kdialogExe <<
endl;
1394 delete d->m_kdialogProcess;
1395 d->m_kdialogProcess = 0;
1399 m_activeList->setEnabled(
false );
1400 m_toolbarCombo->setEnabled(
false );
1402 connect( d->m_kdialogProcess, TQT_SIGNAL( processExited(
KProcess* ) ),
1403 this, TQT_SLOT( slotProcessExited(
KProcess* ) ) );
1406 void KEditToolbarWidget::slotProcessExited(
KProcess* )
1408 m_activeList->setEnabled(
true );
1409 m_toolbarCombo->setEnabled(
true );
1413 if (!d->m_kdialogProcess) {
1414 kdError(240) <<
"Something is wrong here! m_kdialogProcess is zero!" <<
endl;
1418 if ( !d->m_kdialogProcess->normalExit() ||
1419 d->m_kdialogProcess->exitStatus() ||
1420 d->m_kdialogProcess->readln(icon,
true) <= 0 ) {
1421 delete d->m_kdialogProcess;
1422 d->m_kdialogProcess = 0;
1426 ToolbarItem *item = (ToolbarItem*)m_activeList->currentItem();
1428 item->setPixmap(0, BarIcon(icon, 16));
1430 Q_ASSERT( d->m_currentXmlData->m_type != XmlData::Merged );
1432 d->m_currentXmlData->m_isModified =
true;
1438 Q_ASSERT( !act_elem.isNull() );
1439 act_elem.setAttribute(
"icon", icon );
1445 delete d->m_kdialogProcess;
1446 d->m_kdialogProcess = 0;
1449 void KEditToolbar::virtual_hook(
int id,
void* data )
1450 { KDialogBase::virtual_hook(
id, data ); }
1452 void KEditToolbarWidget::virtual_hook(
int id,
void* data )
1453 { KXMLGUIClient::virtual_hook(
id, data ); }
1455 #include "kedittoolbar.moc"