From d62c8c002c51fb7c36487839eeeb4ac89f044dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sl=C3=A1vek=20Banko?= Date: Sat, 26 Mar 2016 13:50:43 +0100 Subject: [PATCH] Initial import of kxmleditor 1.1.4 --- AUTHORS | 4 + CODING | 91 + COPYING | 280 +++ ChangeLog | 1269 +++++++++++ Doxyfile | 266 +++ INSTALL | 167 ++ KXMLEditor.flw | Bin 0 -> 2506 bytes Makefile.am | 29 + Makefile.dist | 14 + README | 22 + TODO | 2 + configure.files | 2 + configure.in.in | 4 + doc/Makefile.am | 6 + doc/en/Makefile.am | 10 + doc/en/index.docbook | 1502 +++++++++++++ doc/en/kparts.png | Bin 0 -> 124983 bytes doc/en/screenshot.png | Bin 0 -> 100110 bytes doc/en/setupdefaults.png | Bin 0 -> 37047 bytes doc/en/setupprintout.png | Bin 0 -> 32288 bytes doc/en/setuptargz.png | Bin 0 -> 31677 bytes doc/en/setuptexteditor.png | Bin 0 -> 41341 bytes doc/en/setuptreeview.png | Bin 0 -> 35871 bytes doc/en/specprocinstrdlg.png | Bin 0 -> 14023 bytes doc/en/texteditor.png | Bin 0 -> 36009 bytes doc/en/xml.png | Bin 0 -> 51086 bytes kxmleditor.lsm | 14 + kxmleditor.spec | 45 + kxmleditor/Makefile.am | 51 + kxmleditor/dcopiface_shell.cpp | 39 + kxmleditor/dcopiface_shell.h | 70 + kxmleditor/kxeshellmanager.cpp | 55 + kxmleditor/kxeshellmanager.h | 65 + kxmleditor/kxmleditor.desktop | 12 + kxmleditor/kxmleditorshell.cpp | 495 +++++ kxmleditor/kxmleditorshell.h | 178 ++ kxmleditor/kxmleditorshell.rc | 31 + kxmleditor/main.cpp | 139 ++ part/Makefile.am | 53 + part/actions.cpp | 229 ++ part/actions.h | 88 + part/commands_edit.cpp | 778 +++++++ part/commands_edit.h | 346 +++ part/commands_file.cpp | 158 ++ part/commands_file.h | 102 + part/commands_insert.cpp | 329 +++ part/commands_insert.h | 94 + part/dcopiface_part_ro.cpp | 67 + part/dcopiface_part_ro.h | 124 ++ part/icons/Makefile.am | 155 ++ part/icons/hi16-action-bookmark_next.png | Bin 0 -> 511 bytes part/icons/hi16-action-bookmark_prev.png | Bin 0 -> 545 bytes part/icons/hi16-action-collapse_node.png | Bin 0 -> 138 bytes part/icons/hi16-action-expand_node.png | Bin 0 -> 188 bytes part/icons/hi16-action-xml_cdata.png | Bin 0 -> 547 bytes part/icons/hi16-action-xml_comment.png | Bin 0 -> 504 bytes .../hi16-action-xml_delete_attribute.png | Bin 0 -> 330 bytes .../icons/hi16-action-xml_delete_contents.png | Bin 0 -> 299 bytes part/icons/hi16-action-xml_delete_element.png | Bin 0 -> 358 bytes part/icons/hi16-action-xml_delete_procins.png | Bin 0 -> 650 bytes part/icons/hi16-action-xml_edit_attribute.png | Bin 0 -> 296 bytes part/icons/hi16-action-xml_edit_contents.png | Bin 0 -> 259 bytes part/icons/hi16-action-xml_edit_element.png | Bin 0 -> 340 bytes part/icons/hi16-action-xml_edit_procins.png | Bin 0 -> 699 bytes .../hi16-action-xml_insert_attribute.png | Bin 0 -> 369 bytes .../icons/hi16-action-xml_insert_contents.png | Bin 0 -> 343 bytes part/icons/hi16-action-xml_insert_element.png | Bin 0 -> 415 bytes part/icons/hi16-action-xml_insert_procins.png | Bin 0 -> 689 bytes part/icons/hi16-action-xml_move_item_down.png | Bin 0 -> 188 bytes part/icons/hi16-action-xml_move_item_up.png | Bin 0 -> 188 bytes part/icons/hi16-action-xml_text.png | Bin 0 -> 580 bytes part/icons/hi22-action-bookmark_next.png | Bin 0 -> 849 bytes part/icons/hi22-action-bookmark_prev.png | Bin 0 -> 859 bytes part/icons/hi22-action-collapse_node.png | Bin 0 -> 764 bytes part/icons/hi22-action-expand_node.png | Bin 0 -> 793 bytes .../hi22-action-xml_delete_attribute.png | Bin 0 -> 389 bytes .../icons/hi22-action-xml_delete_contents.png | Bin 0 -> 337 bytes part/icons/hi22-action-xml_delete_element.png | Bin 0 -> 453 bytes part/icons/hi22-action-xml_delete_procins.png | Bin 0 -> 1142 bytes part/icons/hi22-action-xml_edit_attribute.png | Bin 0 -> 396 bytes part/icons/hi22-action-xml_edit_contents.png | Bin 0 -> 334 bytes part/icons/hi22-action-xml_edit_element.png | Bin 0 -> 454 bytes part/icons/hi22-action-xml_edit_procins.png | Bin 0 -> 1133 bytes .../hi22-action-xml_insert_attribute.png | Bin 0 -> 507 bytes .../icons/hi22-action-xml_insert_contents.png | Bin 0 -> 433 bytes part/icons/hi22-action-xml_insert_element.png | Bin 0 -> 542 bytes part/icons/hi22-action-xml_insert_procins.png | Bin 0 -> 1209 bytes part/icons/hi22-action-xml_move_item_down.png | Bin 0 -> 736 bytes part/icons/hi22-action-xml_move_item_up.png | Bin 0 -> 416 bytes part/icons/hi32-action-bookmark_next.png | Bin 0 -> 1277 bytes part/icons/hi32-action-bookmark_prev.png | Bin 0 -> 1305 bytes part/icons/hi32-action-xml_move_item_down.png | Bin 0 -> 630 bytes part/icons/hi32-action-xml_move_item_up.png | Bin 0 -> 762 bytes part/icons/hi32-app-kxmleditor.png | Bin 0 -> 1813 bytes part/icons/hi48-app-kxmleditor.png | Bin 0 -> 2698 bytes part/icons/lo16-action-bookmark_next.png | Bin 0 -> 276 bytes part/icons/lo16-action-bookmark_prev.png | Bin 0 -> 263 bytes part/icons/lo16-action-collapse_node.png | Bin 0 -> 123 bytes part/icons/lo16-action-expand_node.png | Bin 0 -> 155 bytes .../lo16-action-xml_delete_attribute.png | Bin 0 -> 281 bytes .../icons/lo16-action-xml_delete_contents.png | Bin 0 -> 287 bytes part/icons/lo16-action-xml_delete_element.png | Bin 0 -> 358 bytes part/icons/lo16-action-xml_delete_procins.png | Bin 0 -> 449 bytes part/icons/lo16-action-xml_edit_attribute.png | Bin 0 -> 246 bytes part/icons/lo16-action-xml_edit_contents.png | Bin 0 -> 228 bytes part/icons/lo16-action-xml_edit_element.png | Bin 0 -> 285 bytes part/icons/lo16-action-xml_edit_procins.png | Bin 0 -> 480 bytes .../lo16-action-xml_insert_attribute.png | Bin 0 -> 288 bytes .../icons/lo16-action-xml_insert_contents.png | Bin 0 -> 296 bytes part/icons/lo16-action-xml_insert_element.png | Bin 0 -> 330 bytes part/icons/lo16-action-xml_insert_procins.png | Bin 0 -> 448 bytes part/icons/lo16-action-xml_move_item_down.png | Bin 0 -> 188 bytes part/icons/lo16-action-xml_move_item_up.png | Bin 0 -> 188 bytes part/icons/lo16-app-kxmleditor.png | Bin 0 -> 251 bytes part/icons/lo32-app-kxmleditor.png | Bin 0 -> 578 bytes part/kxe_treeview.cpp | 909 ++++++++ part/kxe_treeview.h | 235 ++ part/kxe_treeviewitem.cpp | 330 +++ part/kxe_treeviewitem.h | 125 ++ part/kxe_viewattributes.cpp | 157 ++ part/kxe_viewattributes.h | 71 + part/kxe_viewelement.cpp | 126 ++ part/kxe_viewelement.h | 94 + part/kxearchiveextssettings.cpp | 153 ++ part/kxearchiveextssettings.h | 113 + part/kxearchiveextssettingspage.ui | 175 ++ part/kxeattachdialogbase.ui | 144 ++ part/kxeattributedialog.cpp | 179 ++ part/kxeattributedialog.h | 82 + part/kxeattributedialogbase.ui | 263 +++ part/kxechardatadialog.cpp | 119 + part/kxechardatadialog.h | 83 + part/kxechardatadialogbase.ui | 213 ++ part/kxechoosestringdialog.cpp | 42 + part/kxechoosestringdialog.h | 44 + part/kxechoosestringdialogbase.ui | 143 ++ part/kxecommand.cpp | 25 + part/kxecommand.h | 37 + part/kxeconfiguration.cpp | 181 ++ part/kxeconfiguration.h | 123 ++ part/kxedocument.cpp | 631 ++++++ part/kxedocument.h | 240 ++ part/kxedocument.rc | 15 + part/kxeelementdialog.cpp | 189 ++ part/kxeelementdialog.h | 92 + part/kxeelementdialogbase.ui | 339 +++ part/kxefilenewdialog.cpp | 29 + part/kxefilenewdialog.h | 31 + part/kxenewfilesettings.cpp | 207 ++ part/kxenewfilesettings.h | 111 + part/kxenewfilesettingspage.ui | 176 ++ part/kxeprintsettings.cpp | 134 ++ part/kxeprintsettings.h | 95 + part/kxeprintsettingspage.ui | 228 ++ part/kxeprocinstrdialog.cpp | 183 ++ part/kxeprocinstrdialog.h | 87 + part/kxeprocinstrdialogbase.ui | 223 ++ part/kxesearchdialog.cpp | 56 + part/kxesearchdialog.h | 57 + part/kxesearchdialogbase.ui | 350 +++ part/kxesettings.cpp | 67 + part/kxesettings.h | 175 ++ part/kxespecprocinstrdialog.cpp | 135 ++ part/kxespecprocinstrdialog.h | 54 + part/kxespecprocinstrdialogbase.ui | 191 ++ part/kxesyntaxhighlighter.cpp | 257 +++ part/kxesyntaxhighlighter.h | 80 + part/kxetexteditordialog.cpp | 120 + part/kxetexteditordialog.h | 68 + part/kxetexteditordialogbase.ui | 154 ++ part/kxetextviewsettings.cpp | 173 ++ part/kxetextviewsettings.h | 105 + part/kxetextviewsettingspage.ui | 266 +++ part/kxetreeviewsettings.cpp | 166 ++ part/kxetreeviewsettings.h | 103 + part/kxetreeviewsettingspage.ui | 226 ++ part/kxmleditorabout.h | 50 + part/kxmleditorfactory.cpp | 104 + part/kxmleditorfactory.h | 55 + part/kxmleditorpart.cpp | 1923 +++++++++++++++++ part/kxmleditorpart.desktop | 11 + part/kxmleditorpart.h | 450 ++++ part/kxmleditorpartBrowseUI.rc | 81 + part/kxmleditorpartEditUI.rc | 186 ++ part/pics/Makefile.am | 38 + part/pics/xml_attribute.png | Bin 0 -> 320 bytes part/pics/xml_cdata.png | Bin 0 -> 468 bytes part/pics/xml_cdata_b.png | Bin 0 -> 490 bytes part/pics/xml_comment.png | Bin 0 -> 379 bytes part/pics/xml_comment_b.png | Bin 0 -> 432 bytes part/pics/xml_contents.png | Bin 0 -> 293 bytes part/pics/xml_contents_b.png | Bin 0 -> 266 bytes part/pics/xml_element.png | Bin 0 -> 367 bytes part/pics/xml_element_b.png | Bin 0 -> 366 bytes part/pics/xml_procinstr.png | Bin 0 -> 929 bytes part/pics/xml_procinstr_b.png | Bin 0 -> 644 bytes part/pics/xml_text.png | Bin 0 -> 533 bytes part/pics/xml_text_b.png | Bin 0 -> 512 bytes part/qdom_add.cpp | 352 +++ part/qdom_add.h | 80 + po/Makefile.am | 6 + po/de.po | 1519 +++++++++++++ po/fr.po | 1469 +++++++++++++ po/pl.po | 1838 ++++++++++++++++ subdirs | 4 + 205 files changed, 25530 insertions(+) create mode 100644 AUTHORS create mode 100644 CODING create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Doxyfile create mode 100644 INSTALL create mode 100644 KXMLEditor.flw create mode 100644 Makefile.am create mode 100644 Makefile.dist create mode 100644 README create mode 100644 TODO create mode 100644 configure.files create mode 100644 configure.in.in create mode 100644 doc/Makefile.am create mode 100644 doc/en/Makefile.am create mode 100644 doc/en/index.docbook create mode 100644 doc/en/kparts.png create mode 100644 doc/en/screenshot.png create mode 100644 doc/en/setupdefaults.png create mode 100644 doc/en/setupprintout.png create mode 100644 doc/en/setuptargz.png create mode 100644 doc/en/setuptexteditor.png create mode 100644 doc/en/setuptreeview.png create mode 100644 doc/en/specprocinstrdlg.png create mode 100644 doc/en/texteditor.png create mode 100644 doc/en/xml.png create mode 100644 kxmleditor.lsm create mode 100644 kxmleditor.spec create mode 100644 kxmleditor/Makefile.am create mode 100644 kxmleditor/dcopiface_shell.cpp create mode 100644 kxmleditor/dcopiface_shell.h create mode 100644 kxmleditor/kxeshellmanager.cpp create mode 100644 kxmleditor/kxeshellmanager.h create mode 100644 kxmleditor/kxmleditor.desktop create mode 100644 kxmleditor/kxmleditorshell.cpp create mode 100644 kxmleditor/kxmleditorshell.h create mode 100644 kxmleditor/kxmleditorshell.rc create mode 100644 kxmleditor/main.cpp create mode 100644 part/Makefile.am create mode 100644 part/actions.cpp create mode 100644 part/actions.h create mode 100644 part/commands_edit.cpp create mode 100644 part/commands_edit.h create mode 100644 part/commands_file.cpp create mode 100644 part/commands_file.h create mode 100644 part/commands_insert.cpp create mode 100644 part/commands_insert.h create mode 100644 part/dcopiface_part_ro.cpp create mode 100644 part/dcopiface_part_ro.h create mode 100644 part/icons/Makefile.am create mode 100644 part/icons/hi16-action-bookmark_next.png create mode 100644 part/icons/hi16-action-bookmark_prev.png create mode 100644 part/icons/hi16-action-collapse_node.png create mode 100644 part/icons/hi16-action-expand_node.png create mode 100644 part/icons/hi16-action-xml_cdata.png create mode 100644 part/icons/hi16-action-xml_comment.png create mode 100644 part/icons/hi16-action-xml_delete_attribute.png create mode 100644 part/icons/hi16-action-xml_delete_contents.png create mode 100644 part/icons/hi16-action-xml_delete_element.png create mode 100644 part/icons/hi16-action-xml_delete_procins.png create mode 100644 part/icons/hi16-action-xml_edit_attribute.png create mode 100644 part/icons/hi16-action-xml_edit_contents.png create mode 100644 part/icons/hi16-action-xml_edit_element.png create mode 100644 part/icons/hi16-action-xml_edit_procins.png create mode 100644 part/icons/hi16-action-xml_insert_attribute.png create mode 100644 part/icons/hi16-action-xml_insert_contents.png create mode 100644 part/icons/hi16-action-xml_insert_element.png create mode 100644 part/icons/hi16-action-xml_insert_procins.png create mode 100644 part/icons/hi16-action-xml_move_item_down.png create mode 100644 part/icons/hi16-action-xml_move_item_up.png create mode 100644 part/icons/hi16-action-xml_text.png create mode 100644 part/icons/hi22-action-bookmark_next.png create mode 100644 part/icons/hi22-action-bookmark_prev.png create mode 100644 part/icons/hi22-action-collapse_node.png create mode 100644 part/icons/hi22-action-expand_node.png create mode 100644 part/icons/hi22-action-xml_delete_attribute.png create mode 100644 part/icons/hi22-action-xml_delete_contents.png create mode 100644 part/icons/hi22-action-xml_delete_element.png create mode 100644 part/icons/hi22-action-xml_delete_procins.png create mode 100644 part/icons/hi22-action-xml_edit_attribute.png create mode 100644 part/icons/hi22-action-xml_edit_contents.png create mode 100644 part/icons/hi22-action-xml_edit_element.png create mode 100644 part/icons/hi22-action-xml_edit_procins.png create mode 100644 part/icons/hi22-action-xml_insert_attribute.png create mode 100644 part/icons/hi22-action-xml_insert_contents.png create mode 100644 part/icons/hi22-action-xml_insert_element.png create mode 100644 part/icons/hi22-action-xml_insert_procins.png create mode 100644 part/icons/hi22-action-xml_move_item_down.png create mode 100644 part/icons/hi22-action-xml_move_item_up.png create mode 100644 part/icons/hi32-action-bookmark_next.png create mode 100644 part/icons/hi32-action-bookmark_prev.png create mode 100644 part/icons/hi32-action-xml_move_item_down.png create mode 100644 part/icons/hi32-action-xml_move_item_up.png create mode 100644 part/icons/hi32-app-kxmleditor.png create mode 100644 part/icons/hi48-app-kxmleditor.png create mode 100644 part/icons/lo16-action-bookmark_next.png create mode 100644 part/icons/lo16-action-bookmark_prev.png create mode 100644 part/icons/lo16-action-collapse_node.png create mode 100644 part/icons/lo16-action-expand_node.png create mode 100644 part/icons/lo16-action-xml_delete_attribute.png create mode 100644 part/icons/lo16-action-xml_delete_contents.png create mode 100644 part/icons/lo16-action-xml_delete_element.png create mode 100644 part/icons/lo16-action-xml_delete_procins.png create mode 100644 part/icons/lo16-action-xml_edit_attribute.png create mode 100644 part/icons/lo16-action-xml_edit_contents.png create mode 100644 part/icons/lo16-action-xml_edit_element.png create mode 100644 part/icons/lo16-action-xml_edit_procins.png create mode 100644 part/icons/lo16-action-xml_insert_attribute.png create mode 100644 part/icons/lo16-action-xml_insert_contents.png create mode 100644 part/icons/lo16-action-xml_insert_element.png create mode 100644 part/icons/lo16-action-xml_insert_procins.png create mode 100644 part/icons/lo16-action-xml_move_item_down.png create mode 100644 part/icons/lo16-action-xml_move_item_up.png create mode 100644 part/icons/lo16-app-kxmleditor.png create mode 100644 part/icons/lo32-app-kxmleditor.png create mode 100644 part/kxe_treeview.cpp create mode 100644 part/kxe_treeview.h create mode 100644 part/kxe_treeviewitem.cpp create mode 100644 part/kxe_treeviewitem.h create mode 100644 part/kxe_viewattributes.cpp create mode 100644 part/kxe_viewattributes.h create mode 100644 part/kxe_viewelement.cpp create mode 100644 part/kxe_viewelement.h create mode 100644 part/kxearchiveextssettings.cpp create mode 100644 part/kxearchiveextssettings.h create mode 100644 part/kxearchiveextssettingspage.ui create mode 100644 part/kxeattachdialogbase.ui create mode 100644 part/kxeattributedialog.cpp create mode 100644 part/kxeattributedialog.h create mode 100644 part/kxeattributedialogbase.ui create mode 100644 part/kxechardatadialog.cpp create mode 100644 part/kxechardatadialog.h create mode 100644 part/kxechardatadialogbase.ui create mode 100644 part/kxechoosestringdialog.cpp create mode 100644 part/kxechoosestringdialog.h create mode 100644 part/kxechoosestringdialogbase.ui create mode 100644 part/kxecommand.cpp create mode 100644 part/kxecommand.h create mode 100644 part/kxeconfiguration.cpp create mode 100644 part/kxeconfiguration.h create mode 100644 part/kxedocument.cpp create mode 100644 part/kxedocument.h create mode 100644 part/kxedocument.rc create mode 100644 part/kxeelementdialog.cpp create mode 100644 part/kxeelementdialog.h create mode 100644 part/kxeelementdialogbase.ui create mode 100644 part/kxefilenewdialog.cpp create mode 100644 part/kxefilenewdialog.h create mode 100644 part/kxenewfilesettings.cpp create mode 100644 part/kxenewfilesettings.h create mode 100644 part/kxenewfilesettingspage.ui create mode 100644 part/kxeprintsettings.cpp create mode 100644 part/kxeprintsettings.h create mode 100644 part/kxeprintsettingspage.ui create mode 100644 part/kxeprocinstrdialog.cpp create mode 100644 part/kxeprocinstrdialog.h create mode 100644 part/kxeprocinstrdialogbase.ui create mode 100644 part/kxesearchdialog.cpp create mode 100644 part/kxesearchdialog.h create mode 100644 part/kxesearchdialogbase.ui create mode 100644 part/kxesettings.cpp create mode 100644 part/kxesettings.h create mode 100644 part/kxespecprocinstrdialog.cpp create mode 100644 part/kxespecprocinstrdialog.h create mode 100644 part/kxespecprocinstrdialogbase.ui create mode 100644 part/kxesyntaxhighlighter.cpp create mode 100644 part/kxesyntaxhighlighter.h create mode 100644 part/kxetexteditordialog.cpp create mode 100644 part/kxetexteditordialog.h create mode 100644 part/kxetexteditordialogbase.ui create mode 100644 part/kxetextviewsettings.cpp create mode 100644 part/kxetextviewsettings.h create mode 100644 part/kxetextviewsettingspage.ui create mode 100644 part/kxetreeviewsettings.cpp create mode 100644 part/kxetreeviewsettings.h create mode 100644 part/kxetreeviewsettingspage.ui create mode 100644 part/kxmleditorabout.h create mode 100644 part/kxmleditorfactory.cpp create mode 100644 part/kxmleditorfactory.h create mode 100644 part/kxmleditorpart.cpp create mode 100644 part/kxmleditorpart.desktop create mode 100644 part/kxmleditorpart.h create mode 100644 part/kxmleditorpartBrowseUI.rc create mode 100644 part/kxmleditorpartEditUI.rc create mode 100644 part/pics/Makefile.am create mode 100644 part/pics/xml_attribute.png create mode 100644 part/pics/xml_cdata.png create mode 100644 part/pics/xml_cdata_b.png create mode 100644 part/pics/xml_comment.png create mode 100644 part/pics/xml_comment_b.png create mode 100644 part/pics/xml_contents.png create mode 100644 part/pics/xml_contents_b.png create mode 100644 part/pics/xml_element.png create mode 100644 part/pics/xml_element_b.png create mode 100644 part/pics/xml_procinstr.png create mode 100644 part/pics/xml_procinstr_b.png create mode 100644 part/pics/xml_text.png create mode 100644 part/pics/xml_text_b.png create mode 100644 part/qdom_add.cpp create mode 100644 part/qdom_add.h create mode 100644 po/Makefile.am create mode 100644 po/de.po create mode 100644 po/fr.po create mode 100644 po/pl.po create mode 100644 subdirs diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..5e0ccde --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +Lumir Vanek +Olaf Hartig +Mateusz Korniak +Adam Charytoniuk \ No newline at end of file diff --git a/CODING b/CODING new file mode 100644 index 0000000..6946486 --- /dev/null +++ b/CODING @@ -0,0 +1,91 @@ +NAMING CONVENTIONS +================== + +CLASS NAMES + +Class names follow Qt and KDE schema, with KXE or KXMLEditor prefix: +KXE....Dialog, KXE....View, KXE....Command for longer names. +examples: KXESpecProcInstrDialog + +or + +KXMLEditor.... for short names +examples: KXMLEditorShell, KXMLEditorShellIface, KXMLEditorAboutData, +KXMLEditorPart + + +VARIABLES + +(1) prefixes for variable names +p - for pointer +psz - for "char *" and "const char *" (zero-terminated usally) +str - for QString objects +b - for booleans +i - for integers +dlg - for dialogs +pDlg - for pointers to dialogs +cmd - for commands +pCmd - for pointers to commands + +(2) prefixes for member variables +Member variables should use the prefixes defined above but should additionally +be prefixed with "m_" or "s_", if they are static. + +Example: + m_pDlgConfig - the member variable is a pointer to a dialog + +(3) prefixes for member functions +sig - for signals +slot - for (normal) slots +slotAct - for slots connected to actions + +COMMENTS + +Comments in header files should stick to the rules for KDoc / Doxygen. +Comments in CPP-files should use only the new C++-style comments // to make +it possible to comment whole functions by using the C-style comments /* ... */. + +SOURCE FORMAT + +The source should be formatted in ANSI style and should be intended with tabs, +like in the following example (use the "Show tabs" option or something similar +in your editor to see the tabs): + +namespace foospace +{ + int Foo() + { + if (isBar) + { + bar(); // this is a + // very long comment + return 1; + } + else + return 0; + } +} + +ADDING NEW FILES +================ + +Adding a new file to our project requires the following: + +* creating it in our source tree +* adding it to the file Makefile.am in the subdirectory of the new file + - all files have to be added to the EXTRA_DIST variable + - all *.cpp and *.ui files have to be added to the *_SOURCES variable + - all *.h files have to be added to the noinst_HEADERS variable +* remove old dependencies + Normally removing the .deps and .libs subdirectories should do. If the application + crashs later due to missing symbols, you have to come back to this point and do + make clean + make distclean +* in the project's root dir call + make -f Makefile.dist + ./configure + make + make install (as root) +* test the application +* add the new file to CVS +* commit the new file to CVS diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..c7aea18 --- /dev/null +++ b/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..ceece31 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,1269 @@ + + +********************************************************************* +* * +* 1.1.4 Stable released * +* * +********************************************************************* + +12.12.2004, Lumir Vanek +======================= +1) Updated /admin with latest kde-common/admin contents + +12.11.2004, Olaf Hartig +======================= +1) Switched the default item insert point to "at bottom" for the "New Element", "New Proc.Instr." and "New CData" dialogs. + +21.10.2004, Olaf Hartig +======================= +1) Implemented feature request #1044396 "Reload function". + +20.10.2004, Olaf Hartig +======================= +1) Fixed a little usability bug. Tabbing between the widgets work (better) now (all unvisible widgets reject focus on tab). +2) Fixed the bug mentioned in feature request #1049159 "Keyboard shortcut for closing the "Edit XML as raw text" win". + +19.10.2004, Olaf Hartig +======================= +1) Implemented feature request #1048738 "F2 button for editing text content". + +14.09.2004, Lumir Vanek +======================= +1) Added fix_paths script to fix hardcoded paths in files generated by dcopidl2cpp + +********************************************************************* +* * +* 1.1.3 Stable released * +* * +********************************************************************* + +12.09.2004, Lumir Vanek +======================= +1) Added french translation maded by Christophe Crier, www.heolys.com +2) Fixed bug [ 988587 ] Non-existent files from cmdline cause silent quit + +18.08.2004, Lumir Vanek +======================= +1) Removed check for special characters in KXECharDataDialog::checkContents + +********************************************************************* +* * +* 1.1.2 Stable released * +* * +********************************************************************* + +08.08.2004, Lumir Vanek +======================= +1) Set raw XML editboxes to PlainText, instead to Auto, to avoid + unnecessary special character conversions. +2) Moved rest of actions and KCommandHistory from doc to part. + +08.08.2004, Lumir Vanek +======================= +1) Moved actions for Save/SaveAs, Cut/Copy/Paste from Shell to Part, + where is better place for them. Started testing Quanta plugin. + + +********************************************************************* +* * +* 1.1.1 Stable released * +* * +********************************************************************* + +08.07.2004, Lumir Vanek +======================= +1) Added Wrap on/off to text view configuration page + +17.07.2004, Lumir Vanek +======================= +1) Applied patch kxmleditor-1.1.0-gcc34.patch, Bugzilla Bug 57019 kxmleditor 1.1.0 fails + (http://bugs.gentoo.org/show_bug.cgi?id=57019) + +11.07.2004, Lumir Vanek +======================= +1) Applied patch #988560 Default to UTF-8 for new files +2) Applied patch #988558 Desktop entry cleanup +3) Applied patch #958302 Avoid warning on startup +4) Applied patch #958301 Avoid deprecation warnings +5) Changed 4 occurence of SLOT(0) to 0 in KXEShellManager *KXMLEditorShell + +********************************************************************* +* * +* 1.1.0 Stable released * +* * +********************************************************************* + + +09.07.2004, Lumir Vanek +======================= +1) Updated version info in .ui files to 3.3 +2) Commented time meassuring in KXMLEditorPart::slotDocOpened() + +06.07.2004, Lumir Vanek +======================= +1) Fixed bug reported by Robin Rosenberg : when opened XML without specified encoding, default must be used (UTF-8) + +01.06.2004, Lumir Vanek +======================= +1) Minor fixes in documentation +2) Fixed bug [ 946229 ] Element name cannot start with 'xml' or 'XML'? + +28.04.2004, Lumir Vanek +======================= +1) Added support for opening compressed SVG - svgz files to KXEDocument::open(...) + +27.04.2004, Lumir Vanek +======================= +1) Improved syntax highlighter to highlight multiline comment +2) Increased max KXmlEditorComboAction items count from 5 to 15 +3) Added *.svg to supported file types + +11.04.2003, Lumir Vanek +======================= +1) Set active target +2) Added check to KXMLEditorShell::setPart, last line connecting to NULL variable m_windowMenu + +26.03.2004, Olaf Hartig +======================= +1) Changed the code in KXE_TreeView::updateNodeMoved to remove the calls of + KListViewItem::moveItem, because this function is marked as deprecated + in the KDE API. +2) Implemented the "create tree view items on demand" feature, that speeds + the loading of deep nested XML documents. This feature can be enabled/disabled + in the configuration dialog. Take a look at KXMLEditorPart::slotDocOpened to + learn about measuring the feature's advantage in loading time. +3) Fixed a performance bug with opening documents in KXEDocument::open and + (temporary) introduced code to measure the difference. + +19.02.2004, Adam Charytoniuk +======================= +1) Introduction of document/view model. Started... +2) New shell actions and new menu "Window". +3) Updated pl.po file + +18.02.2004, Olaf Hartig +======================= +1) Finished the german localization. + +12.02.2003, Lumir Vanek +======================= +1) Removed kxmledtor.kdevprj from Makefile.am. + +10.02.2004, Olaf Hartig +======================= +1) Switched the project to be a KDevelop 3 project. + +08.02.2003, Adam Charytoniuk +======================= +1) Update of pl.po translation file + +05.02.2004, Olaf Hartig +======================= +1) Fixed a usability problem with a useless messagebox appearing, when the users wants to edit the properties of the special proc.instr. +2) Removed several inconsisties with tooltips and What's This help in dialogs and configuration pages. + +04.02.2004, Adam Charytoniuk +======================== +1) Added file for polish translation, translation started. + +02.02.2004, Olaf Hartig +======================= +1) Fixed the problems with our/KDE's localization framework. +2) Added a file for the german translation. + +********************************************************************* +* * +* 1.0.0 Stable released * +* * +********************************************************************* + + +24.01.2003, Adam Charytoniuk +======================= +1) New icons for application +2) TODO updated + +25.01.2003, Lumir Vanek +======================= +1) Used KTempFile when compressed file open, instead of temporary.tmp + +20.01.2003, Lumir Vanek +======================= +1) Touched dialogs and tested compiling and making RPM on KDE 3.2 RC1. Successfull. + +17.01.2003, Lumir Vanek +======================= +1) Added Element indentation to text view setting +2) Adjusted columns in KXE_ViewAttributes::slotChange + +10.01.2003, Lumir Vanek +======================= +1) Applyied patch [ 827616 ] "freedesktop.org desktop entry tweak" to kxmleditor.desktop + +********************************************************************* +* * +* 0.9.2 Beta released * +* * +********************************************************************* + + +10.01.2003, Lumir Vanek +======================= +1) Renamed following dialogs in .kdevprj file: + ./part/kxeelementdialogbase.ui + ./part/kxeattributedialogbase.ui + ./part/kxechardatadialogbase.ui + ./part/kxesearchdialogbase.ui + ./part/kxechoosestringdialogbase.ui + ./part/kxeprocinstrdialogbase.ui + ./part/kxespecprocinstrdialogbase.ui +2) Checked those dialogs if What's This help exist, and added it, if not. + +06.01.2004, Olaf Hartig +======================= +1) Removed the old configuration framework and the corresponding files: + ./part/confpage_defaults.ui + ./part/confpage_text_editor.ui + ./part/confpage_print.ui + ./part/confpage_treeview.ui + ./part/confpage_targzext.ui + ./part/confpage_xml.ui + ./part/dlgconfiguration.h + ./part/dlgconfiguration.cpp + +********************************************************************* +* * +* 0.9.1 Beta released * +* * +********************************************************************* + +03.01.2003, Lumir Vanek +======================= +1) Disabled m_pActEditRawXml when element is not selected +2) Allowed to paste element with subtree to empty document +3) Fixed bug in KXE_TreeViewItem. It's destructor not inform your nextSibling about deleting *this*, + and siblings m_pPrevSibling pointed to deleted KXE_TreeViewItem. I hope, this fixing bug #858730. +4) Fixed another bug in KXE_TreeViewItem::lastChild(). It returned 0, if more than one lastChild() exists. +5) Registered renamed files in KDevelop project +6) Attribute name invalid characters set same as element + +02.01.2004, Adam Charytoniuk +============================== +1) Small compiler warnings removal started. + +31.12.2003, Olaf Hartig +======================= +1) Added What's This help to the configuration dialog's pages. + +30.12.2003, Olaf Hartig +======================= +1) Split the tree view configuration setting "enable drag and drop" to "enable dragging" and "enable dropping" and implemented the usage of these settings in the tree view. +2) Updated the .cvsignore files. + +29.12.2003, Olaf Hartig +======================= +1) Renamed the files (containing stuff for dialog classes) + ./part/dlgxmlprocinstrbase.ui + ./part/dlgxmlprocinstr.h + ./part/dlgxmlprocinstr.cpp + ./part/dlgsearchbase.ui + ./part/dlgsearch.h + ./part/dlgsearch.cpp + ./part/dlgxmlspecprocinstrbase.ui + ./part/dlgxmlspecprocinstr.h + ./part/dlgxmlspecprocinstr.cpp + ./part/dlgxmlelementbase.ui + ./part/dlgxmlelement.h + ./part/dlgxmlelement.cpp + ./part/dlgxmlattributebase.ui + ./part/dlgxmlattribute.h + ./part/dlgxmlattribute.cpp + ./part/dlgxmlchardatabase.ui + ./part/dlgxmlchardata.h + ./part/dlgxmlchardata.cpp + ./part/dlgxmlattachbase.ui + ./part/dlgchoosestringbase.ui + ./part/dlgchoosestring.h + ./part/dlgchoosestring.cpp + ./part/dlgfilenew.h + ./part/dlgfilenew.cpp + to + ./part/kxeprocinstrdialogbase.ui + ./part/kxeprocinstrdialog.h + ./part/kxeprocinstrdialog.cpp + ./part/kxesearchdialogbase.ui + ./part/kxesearchdialog.h + ./part/kxesearchdialog.cpp + ./part/kxespecprocinstrdialogbase.ui + ./part/kxespecprocinstrdialog.h + ./part/kxespecprocinstrdialog.cpp + ./part/kxeelementdialogbase.ui + ./part/kxeelementdialog.h + ./part/kxeelementdialog.cpp + ./part/kxeattributedialogbase.ui + ./part/kxeattributedialog.h + ./part/kxeattributedialog.cpp + ./part/kxechardatadialogbase.ui + ./part/kxechardatadialog.h + ./part/kxechardatadialog.cpp + ./part/kxeattachdialogbase.ui + ./part/kxechoosestringdialogbase.ui + ./part/kxechoosestringdialog.h + ./part/kxechoosestringdialog.cpp + ./part/kxefilenewdialog.h + ./part/kxefilenewdialog.cpp + +28.12.2003, Adam Charytoniuk +============================= +1) Warning free code in kxmleditorpart.cpp file + +28.12.2003, Olaf Hartig +======================= +1) Added the function updatePage to all configuration setting groups and fixed a little bug that occured during the creation of their pages. +2) Implemented the missing case of using the new configuration framework (see yesterdays entry). + +27.12.2003, Olaf Hartig +======================= +1) Implemented usage of the new configuration framework in all cases except one (this one is a little bit more difficult - I'm working on it). + +24.12.2003, Lumir Vanek +======================= +1) Registered KXE...Settings files in KDevelop + +23.12.2003, Olaf Hartig +======================= +1) Added the following classes for the new configuration framework: + - KXEConfiguration (files: kxeconfiguration.h, kxeconfiguration.cpp) + - KXESettings (files: kxesettings.h, kxesettings.cpp) + - KXETreeViewSettingsPage (files: kxetreeviewsettingspage.ui) + - KXETreeViewSettings (files: kxetreeviewsettings.h, kxetreeviewsettings.cpp) + - KXENewFileSettingsPage (files: kxenewfilesettingspage.ui) + - KXENewFileSettings (files: kxenewfilesettings.h kxenewfilesettings.cpp) + - KXEPrintSettingsPage (files: kxeprintsettingspage.ui) + - KXEPrintSettings (files: kxeprintsettings.h, kxeprintsettings.cpp) + - KXEArchiveExtsSettingsPage (files: kxearchiveextssettingspage.ui) + - KXEArchiveExtsSettings (files: kxearchiveextssettings.h, kxearchiveextssettings.cpp) +2) Implemented the initialization of the new conf. framework in our factory. +3) Added the configuration settings group for the text view and the corresponding dialog page. New classes: + - KXETextViewSettingsPage (file: kxetextviewsettingspage.ui) + - KXETextViewSettings (files: kxetextviewsettings.h, kxetextviewsettings.cpp) + +********************************************************************* +* * +* 0.9.0 Beta released * +* * +********************************************************************* + + +22.12.2003, Lumir Vanek +======================= +1) Finished KXESyntaxHighlighter +2) Updated documentation +3) Added "new" symbol to char data icons +4) Incremented version to 0.9 + +21.12.2003, Adam Charytoniuk +=============================== +1) Positions of splitters are saved and restored from config. +2) inserting element action is disabled when processing instruction is selected +3) splitters are working smoothly + +21.12.2003, Lumir Vanek +======================= +1) Enhanced KXESyntaxHighlighter +2) Removed ConfPage_SpecChars from project +3) Added ConfPage_TextEditor to project + +20.12.2003, Lumir Vanek +======================= +1) Finished KXEEditRawXmlCommand +2) Finished KXETextEditorDialog + +20.12.2003, Adam Charytoniuk +=============================== +1) Adding kxmleditorpart actions to configurable shortcut dialog. +2) Mailing documents action added. +3) Correcting background in a path toolbar label + +16.12.2003, Lumir Vanek +======================= +1) Added kxesyntaxhighlighter.cpp to Makefile.am + +16.12.2003, Adam Charytoniuk +============================ +1) correction of Makefile.am in part directory +2) KXEDeleteNodeCommand remembers it's sibling node now + +15.11.2003, Olaf Hartig +======================= +1) Appended the section "ADDING NEW FILES" to ./CODING +2) Fixed bug in KXMLEditorShell::slotFileSaveAs resulting in wrong filename extensions. +3) Moved of the filter for file dialogs from the header- to the sourcefile. + +14.12.2003, Lumir Vanek +======================= +1) Started implementing KXETextEditorDialog and KXESyntaxHighlighter + +********************************************************************* +* * +* 0.8.5 Beta released * +* * +********************************************************************* + + +13.12.2003, Adam Charytoniuk +============================ +1) bug with enabling Paste instead of Print action in shell contructor corrected. +2) Apropriate captions for Insert Text, Insert CDATA, Insert Comment dialogs. +3) slotTextChanged and slotFindInChanged in KXESearchDialog changed into virtual (like in base class) + +13.12.2003, Lumir Vanek +======================= +1) Added attribute checking, KXEAttributeDialog::slotNameChanged, ... +2) Changed XML path information to more like XPATH standart +3) Added new types to File Open/Save dialogs +4) Resolved problem with proc. instr. in path bar + +12.12.2003, Lumir Vanek +======================= +1) Added character data checking, KXECharDataDialog::checkContents +2) Added proc. instr. checking, KXEProcInstrDialog::slotTargetChanged, slotDataChanged + +09.12.2003, Adam Charytoniuk +============================ +1) New actions for Insert Text, Insert CDATA, Insert Comment + +07.12.2003, Lumir Vanek +======================= +1) Renamed dialog classes, incremented version number +2) Implemented paste Commands +3) Implemented d&d undo/redo +4) Added element name checking: KXEElementDialog::checkElementName +5) Added element name checking to inplace element editing + +06.12.2003, Lumir Vanek +======================= +1) Implemented KXEEditCharDataCommand, KXEEditProcInstrCommand, KXEEditElementCommand +2) Implemented KXEEditAttrNameCommand, KXEEditAttrValueCommand, KXEDeleteAllAttribCommand + +02.12.2003, Adam Charytoniuk +============================= +1) Implemented KXEVersionEncodingCommand + +30.11.2003, Lumir Vanek +======================= +1) Implemented KXEDeleteNodeCommand, KXEDeleteAttrCommand, KXEUpCommand, KXEDownCommand + +29.11.2003, Lumir Vanek +======================= +1) Added comands.h/cpp files to KDevelop project file (register it) to + display class names in tree +2) Fixed bug in KXEStylesheetDetachCommand. Code for execute was mistakely placed + to destructor, and code for unexecute was in execute. +3) Implemented KXEElementCommand, KXECharDataCommand, KXEProcInstrCommand, KXEAttributeCommand. + + +26.11.2003, Lumir Vanek +======================= +1) Changes message "Pleasse use menu item XML -> Version and encoding ..." to "... File -> ..." + +24.11.2003, Adam Charytoniuk +============================ +1) Undo/Redo framework added. KCommandHistory is now used in kxmleditorpart. + +24.11.2003, Adam Charytoniuk +============================ +1) error in updateActions() detected & corrected - this was cause of crash when working in read-only mode. +2) actions rearranged + +********************************************************************* +* * +* 0.8.4 Beta released * +* * +********************************************************************* + +20.11.2003, Adam Charytoniuk +============================ +1) Updating some actions in XML menu after file is opened. +2) Corrected Makefile.am in icons directory (previously also icons from local source directory were removed during uninstall) + +16.11.2003, Olaf Hartig +======================= +1) Removed the default name "Untitled" for new documents and changed the checks + for it. They use KURL::isEmpty now (it's more standard). +2) Chanced the dates in the copyright notes in every sourcefile (*.h, *.cpp). + +15.11.2003, Lumir Vanek +======================= +1) Fixed KXMLEditorPart::openFile() and saveFile() - opening and saving compressed files. + New KOffice use KZip instead of KTarGz for storing files. +2) Added Adam to developers list and increment version to 0.8.4 + +13.11.2003, Adam Charytoniuk +============================ +1) Controls on some dialogs have been rearranged, Tab order was corrected +2) The order in which top-level processing instructions are enetered is as follows: + // special proc instruction + // whatever top-level proc instruction, e.g. + + +13.11.2003, Olaf Hartig +======================= +1) Changed the behavior of opening a file to the SDI paradigm. This means, if the current shell doesn't contain a new and unmodified part, a new shell is created to open the file in. +2) Fixed bug [ 835971 ] opening files is blocked + ( I left the test for being modified in KXMLEditorPart::openFile, but due to new behavior of opening files this test should never succeed. ) + +11.11.2003, Olaf Hartig +======================= +1) Since KXMLEditorShell::slotFileNew always crashed (for me), I changed it. Additional advantage of the new code: the declaration of our part isn't needed (explicitly) in the shells definition anymore. +2) Added the file CODING, which defines coding guidelines (these are conventions for variable names, comments and source format). + +10.11.2003, Adam Charytoniuk +============================ +1) Attaching / detaching schemas for xml files +2) Attaching / detaching stylesheets (XSL/XSLT) for xml files +3) Configuring behaviour when new files are created in kxmleditor configuration + +09.11.2003, Adam Charytoniuk +============================ +1) Support for File->New added + + +********************************************************************* +* * +* 0.8.3 Beta released * +* * +********************************************************************* + + +09.11.2003, Lumir Vanek +======================= +1) Fixed bug [ 819229 ] annoying behaviour when adding new attributes +2) Fixed bug [ 726776 ] bad xml encoding + +03.11.2003, Lumir Vanek +======================= +1) Fixed main menu, not contained "Delete Attribute" item. +2) Join toolbar icon "Delete Attribute" to function "Delete Attribute" istead of "Delete all Attributes" +3) Added question before deleting all attributes +4) Implemented in-place attribute names editing + +03.11.2003, Olaf Hartig +======================= +1) Added keyboard accelerators to our dialogs. +2) Added the possibility to edit proc. instructions with double click (analog to the problem resolved by Lumir on 01.11.2003) + +01.11.2003, Lumir Vanek +======================= +1) Resolved problem "Double click for editing character data" + +29.07.2003, Olaf Hartig +======================= +1) Fixed the toolbar problems. + +23.07.2003, Lumir Vanek +======================= +1) Trying to fix problem with configuring main toolbar. I will continue discovery this problem + +13.07.2003, Lumir Vanek +======================= +1) Finished dialog DlgXMLSpecProcInstr for editing spec. proc. instr. + +10.07.2003, Lumir Vanek +======================= +1) Updated /admin for KDevelop 2.1.5 + +06.07.2003, Lumir Vanek +======================= +1) Created dialog DlgXMLSpecProcInstr for proc. instruction: + + +********************************************************************* +* * +* 0.8.1 Beta released * +* * +********************************************************************* + + +13.01.2003, Lumir Vanek +======================= +Fixed some losted edit lines in dialogs. Qt designer bug ? + +02.12.2002, Lumir Vanek +======================= +1) Fixed some compilation warnings + +07.11.2002, Olaf Hartig +======================= +1) Implemented the possibility to use namespaces for XML elements. + +14.10.2002, Lumir Vanek +======================= +1) Fixed dlgsearchbase.ui layout + +10.09.2002, Olaf Hartig +======================= +1) Fixed g++ 3.2 compile problem (#605853 - see sourceforge project page), removed the default arguments from ./part/dlgxmlattribute.cpp + +20.08.2002, Olaf Hartig +======================= +1) Added the possibility to have proc.instr. as root nodes. +2) Added the write-actions to the tree views context menus. + +02.08.2002, Lumir Vanek +======================= +1) Inserted Find icon to toolbar +2) After opening XML file, pathbar combo is cleared +3) After selecting nonexists item in pathbar combo, item is removed from combo +4) Fixed KXMLEditorPart::slotXmlElementDelete(). After deleting root element, Insert Element was disabled + + +********************************************************************* +* * +* 0.8 Beta released * +* * +********************************************************************* + +25.07.2002, Olaf Hartig +======================= +1) Added the files ./part/actions.h and ./part/actions.cpp to the KDevelop project file. + + +23.07.2002, Olaf Hartig +======================= +1) Forgot to remove ./kxmleditor/kxmleditorui.rc from ./kxmleditor/Makefile.am + +22.07.2002, Lumir Vanek +======================= +1) Removed rest of debugging code from DlgXMLElement::fillElement +2) Changed version number to 0.8 + +22.07.2002, Olaf Hartig +======================= +1) Removed the old KXMLEditor code. Therefore removed the following files from CVS: + ./kxmleditor/actions.cpp + ./kxmleditor/actions.h + ./kxmleditor/choosestringdlg.cpp + ./kxmleditor/choosestringdlg.h + ./kxmleditor/choosestringdlgbase.ui + ./kxmleditor/dcopiface_app.cpp + ./kxmleditor/dcopiface_app.h + ./kxmleditor/kxmleditor.cpp + ./kxmleditor/kxmleditor.h + ./kxmleditor/kxmleditoractions.h + ./kxmleditor/kxmleditordoc.cpp + ./kxmleditor/kxmleditordoc.h + ./kxmleditor/kxmleditorui.rc + ./kxmleditor/kxmleditorview.cpp + ./kxmleditor/kxmleditorview.h + ./kxmleditor/optionsdialog.cpp + ./kxmleditor/optionsdialog.h + ./kxmleditor/searchdlg.cpp + ./kxmleditor/searchdlg.h + ./kxmleditor/searchdlgbase.ui + ./kxmleditor/tablewidget.cpp + ./kxmleditor/tablewidget.h + ./kxmleditor/xml_base.cpp + ./kxmleditor/xml_base.h + ./kxmleditor/xmlattributedlg.cpp + ./kxmleditor/xmlattributedlg.h + ./kxmleditor/xmlattributedlgbase.ui + ./kxmleditor/xmlcontentsdlg.cpp + ./kxmleditor/xmlcontentsdlg.h + ./kxmleditor/xmlcontentsdlgbase.ui + ./kxmleditor/xmlelementdlg.cpp + ./kxmleditor/xmlelementdlg.h + ./kxmleditor/xmlelementdlgbase.ui + ./kxmleditor/xmlprocinsdlgbase.ui + ./kxmleditor/xmlprocinstrdlg.cpp + ./kxmleditor/xmlprocinstrdlg.h + ./kxmleditor/xmlstructureparser.cpp + ./kxmleditor/xmlstructureparser.h + ./kxmleditor/xmltreeview.cpp + ./kxmleditor/xmltreeview.h + +22.07.2002, Lumir Vanek +======================= +1) Documentation updated +2) Modified KXMLEditorPart::saveFile() for several encodings + +19.07.2002, Olaf Hartig +======================= +1) Added inplace editing for attribute values to the attribute view (KXE_ViewAttributes). + +18.07.2002, Olaf Hartig +======================= +1) Implemented the dialog for defining XML attributes (class: DlgXMLAttribute) +2) Implemented the possiblity to add attributes to XML elements. +3) Added the possibility to request context menus to the part (KXMLEditorPart::slotContextMenuRequested). +4) Added context menus to the attributes view. +5) Modified the tree view (KXE_TreeView) to use the parts new context menu request possibility. +6) Added the action "Delete All Attributes" to the part. +7) Added the action "Delete Attribute" to the part. + +12.07.2002, Olaf Hartig +======================= +1) Added the files + ./part/dlgxmlattributebase.ui + ./part/dlgxmlattribute.h + ./part/dlgxmlattribute.cpp + +11.07.2002, Olaf Hartig +======================= +1) Removed KXE_TreeView::sigItemRenamedInplace since it's useless. +2) Implemented the read only stuff for the attributes view (KXE_ViewAttributes). + +10.07.2002, Olaf Hartig +======================= +1) Fixed little issues: + - the shell doesn't has to know exactly about it's part (it's simply a KParts::ReadWritePart) + - changed the type of KXMLEditorShell::m_pPart to KParts::ReadWritePart* + +04.07.2002, Lumir Vanek +======================= +1) Fixed bug in drap&drop - moved item wasn't properly deleted + +28.06.2002, Lumir Vanek +======================= +1) Handle with Untitled document + +25.06.2002, Olaf Hartig +======================= +1) Updated ./part/pics/Makefile.am for Lumirs new icons. + +25.06.2002, Lumir Vanek +======================= +1) Finished implementing Save/Save As +2) Painted icons for bookmarked items and use it +3) Found bug - pressing "Prev bookbark" on first bookmarked item caused crash. + Fixed two KXE_TreeViewItem constructors to initialize m_pPrevSibling = 0. + +24.06.2002, Olaf Hartig +======================= +1) Added the files + - ./part/dlgchoosestringbase.ui + - ./part/dlgchoosestring.h + - ./part/dlgchoosestring.cpp + +24.06.2002, Lumir Vanek +======================= +1) Started implementing Save/Save As +2) Modified Open code for compressed files + +20.06.2002, Lumir Vanek +======================= +1) Continue implementing Cut/Copy/Paste +2) Started implementing Drag&Drop + +14.06.2002, Olaf Hartig +======================= +1) Commented everything for the XML and the special characters page in the parts configuration dialog because it is not needed for the part using only DOM parser. + +13.06.2002, Olaf Hartig +======================= +2) Implemented the correct behaviour for changing elements tag names via inplace-renaming in the parts tree view. + +13.06.2002, Lumir Vanek +======================= +1) Implemented KXMLEditorPart::slotEditCopy() +2) Extended the KXMLEditorBrowserExtension class and implemented KXMLEditorShell to serve this browser extension as templates the actions "Edit Paste" without really implementing these actions. +3) Implemented Cut/Copy/Paste for XML elements + + +13.06.2002, Olaf Hartig +======================= +1) Fixed several little problems/bugs with the part + - quitting the app didn't care about modified documents (./kxmleditor/kxmleditorshell.cpp) + - merging in the shells main toolbar (./kxmleditor/kxmleditorshell.rc) and in ./part/kxmleditorpartBrowseUI.rc + - disabled word wraping for editboxes in the dialogs DlgXMLCharData (./part/dlgxmlchardatabase.ui) and DlgXMLProcInstr (./part/dlgxmlprocinstrbase.ui) + - changed the contents and proc.instruction view from QMultiLineEdit to QTextEdit (since QMultiLineEdit is obsolete in Qt3) and disabled wordwraping (./part/kxmleditorpart.cpp ./part/kxmleditorpart.h ) + - changing a content element or a proc.instruction didn't updated the corresponding view immediately (./part/kxmleditorpart.cpp) + +12.06.2002, Olaf Hartig +======================= +1) Extended the KXMLEditorBrowserExtension class and implemented KXMLEditorShell to serve this browser extension as templates the actions "Edit Cut" and "Edit Copy" without really implementing these actions. +2) Changed the proc.instruction view from KXE_ViewProcInstr to QMultiLineEdit. + therefore removed the files + ./part/kxe_viewprocinstr.cpp + ./part/kxe_viewprocinstr.h +3) Changed the dialog DlgXMLProcInstr to use a multiline editbox for the processing instruction. +4) Little change to the tree items representing porc.instructions - they now show only the target. +5) Little bugfix - the icon for proc.instruction wasn't installed. + +9.6.2002, Lumir Vanek +===================== +1) Fixed problem with saving mixed elements + texts, xml_base.cpp - XmlElement::save. Bug reported by Ralf Ruth + + +28.05.2002, Olaf Hartig +======================= +1) Applied patch (#559922 - see sourceforge project page) from Robin Green to fix gcc 3.1 compile problems. +2) Fixed bug (#556148 - see sourceforge project page) reported by R.F.Pels which removes the undefined symbol DlgXMLProcInstr::fillProcInstr +3) Fixed a bug causing the part to crash in read only mode + +06.05.2002, Olaf Hartig +======================= +1) Added the actions "Move XML Node Up" and "Move XML Node Down" to the part +2) Added automatic selection of created/changed/moved tree view items to the part +3) Added enabling/disabling of the XML actions depending on the selected node + + +********************************************************************* +* * +* 0.7.2 Beta released (USE_KPART 0) * +* * +********************************************************************* + + +06.05.2002, Olaf Hartig +======================= +1) Implemented the class DlgXMLCharData +2) Added the actions "Insert New Character Data", "Edit Character Data" and "Delete Character Data" to the part +3) Fixed two little bugs with comment nodes + +25.04.2002, Olaf Hartig +======================= +1) Added the files + - ./part/dlgxmlchardatabase.ui + - ./part/dlgxmlchardata.h + - ./part/dlgxmlchardata.cpp + +24.04.2002, Olaf Hartig +======================= +1) Added the files + - ./part/dlgxmlprocinstrbase.ui + - ./part/dlgxmlprocinstr.h + - ./part/dlgxmlprocinstr.cpp +2) Implemented the class DlgXMLProcInstr +3) Changed the tab sequence of the parts XML element dialog +4) Changed the tab sequence of the parts proc. instruction dialog +5) Added the actions "Insert New Proc.Instruction", "Edit Proc.Instruction" and "Delete Proc.Instruction" to the part + +23.04.2002, Olaf Hartig +======================= +1) Developed the new slots + - KXE_TreeView::slotUpdateNodeChanged + - KXE_TreeView::slotUpdateNodeCreated + - KXE_TreeView::slotUpdateClear + which change or create new treeview items. +2) Changed the code implementation of the "Insert New Element" and "Edit Element" actions, to use the new slots. +3) Developed the new slot + - KXE_TreeView::slotUpdateNodeDeleted + which deletes treeview items corresponding to the deleted nodes. +4) Added the "Delete Element" action to the part +5) Slightly changed KXE_TreeView::selectNode + +19.04.2002, Olaf Hartig +======================= +1) Added parameter checking to DlgXMLElement functions to prevent crashes + +18.04.2002, Olaf Hartig +======================= +1) Extended DlgXMLElement dialog to append elements autonomous to their parents. + +17.04.2002, Olaf Hartig +======================= +1) Created a dialog for editing of XML elements for the part + New files: + - ./part/dlgxmlelementbase.ui + - ./part/dlgxmlelement.h + - ./part/dlgxmlelement.cpp +2) Added the "Insert New Element" action to the part +3) Slightly changed DlgXMLElement and commented this class +4) Changed the name of KXMLEditorPart::slotXmlInsertElement to KXMLEditorPart::slotXmlElementInsert + (more consistent in my eyes) +5) Fixed a little bug in KXMLEditorPart::slotXmlElementInsert + (Even pressing cancel in the XML element dialog made the document modified) +6) Added the "Edit Element" action to the part +7) Implemented window caption change (when the document was modified) to the part + +16.04.2002, Olaf Hartig +======================= +1) Splitted the XMLGUI resource file for the part (old name: ./part/kxmleditorpart.rc) into + ./part/kxmleditorpartBrowseUI.rc (with the read only actions) and + ./part/kxmleditorpartEditUI.rc (with the additionally write actions). + If the part is constructed as read/write part these files are merged. + +13.4.2002, Lumir Vanek +======================= +1) Added error detection, when XML is opened using QDomDocument::setContent(...) + +11.4.2002, Lumir Vanek +======================= +1) Version changed to 0.7.2, nonpublic release for KDE 3 with USE_KPART 0 + +9.4.2002, Lumir Vanek +====================== +1) Updated /admin subdirectory for build on KDE 3 + +07.04.2002, Olaf Hartig +======================= +1) Changed the parts baseclass to KParts::ReadWritePart to start implementing write functionality. + +06.04.2002, Olaf Hartig +======================= +1) Added a statusbar to the shell. +2) Added saving of window settings to the shell. +3) Added the possibility to toggle the status- and the toolbar to the shell. +4) Added the OpenRecentFiles action to the shell. +5) Added the possibility to specify several files to be opened as command line arguments for the shell. +6) Added session management to the shell. +7) Added the possibility to configure key bindings and toolbars to the shell. + +02.04.2002, Olaf Hartig +======================= +1) (Re)Implemented different element display modes (no attributes, attribute names only, attribute names and values) to treeview of the part + +21.01.2002, Olaf Hartig +======================= +1) Included several Qt- and KDE-header files and changed the base class of KXMLEditorFactory (from KLibFactory to KParts::Factory) to make the whole project be compileable with KDE3 + +20.01.2002, Olaf Hartig +======================= +1) (Re)Implemented the parts configuration dialog +2) Removed ./config.h.in from CVS because it's not needed here + +19.1.2002, Lumir Vanek +====================== +1) Decrease size of pixmap "locationbar_erase" on toobar to 16x16 in KXMLEditorPart::KXMLEditorPart, to make look uniform with Konqueror + +16.01.2001, Lumir Vanek +======================= +1) Fixed bug in, kxmleditorshell.cpp, KXMLEditorShell::KXMLEditorShell(). + ...->factory("libkxmleditorpart") instead of "libkxmleditor". + Now application not crash after start when compiled with USE_KPART 1 + +10.01.2002, Olaf Hartig +======================= +1) (Re)Implemented next/prev.bookmark action for the part. +2) (Re)Implemented the possibility for the part to select a tree item by giving a path +3) Added the action "Deselect" to the tree views context menus (popup menus) + +07.01.2002, Olaf Hartig +======================= +1) (Re)Implemented toggle bookmark action for the part. + +06.01.2002, Olaf Hartig +======================= +1) (Re)Implemented find and find next actions for the part. Moved the functionality from the tree view to the part itself. +2) Added possibility to disable "Find"-button at the parts search dialog (DlgSearch) if no search-area (Find in...) is given. +3) Removed service type "Browser/View" from ./part/kxmleditorpart.desktop + +05.01.2002, Olaf Hartig +======================= +1) Changed the parts search dialog classes (DlgSearchBase, DlgSearch) to reduce memory usage +2) Added the functions domTool_nextNode and domTool_match (see ./part/qdom_add.h, ./part/qdom_add.cpp) for further implementation of find(next) actions to the part + +21.12.2001, Olaf Hartig +======================= +1) Fixed some issues due to yesterdays renaming of the part's class OptionsDialog to DlgConfiguration +2) Renamed the part's class to DlgSearchBase (from SearchDlgBase) +3) Renamed the part's class SearchDlg to DlgSearch +4) Added the files in ./part/ to the KDevelop project file +5) (Re)implemented KXE_TreeView::getSelectedPath() +6) Moved the following files from ./part/ to ./part/icons/ + lo16-app-kxmleditor.png + lo32-app-kxmleditor.png + hi32-app-kxmleditor.png + hi48-app-kxmleditor.png + +20.12.2001, Olaf Hartig +======================= +1) Removed ./kxmleditor/kxmleditorabout.h + now ./kxmleditor/main.cpp uses ./part/kxmleditorabout.h instead +2) Renamed the following files: + ./part/searchdlg.cpp to ./part/dlgsearch.cpp + ./part/searchdlg.h to ./part/dlgsearch.h + ./part/searchdlgbase.ui to ./part/dlgsearchbase.ui + ./part/optionsdialog.h to ./part/dlgconfiguration.h + ./part/optionsdialog.cpp to ./part/dlgconfiguration.cpp + +18.12.2001, Lumir Vanek +======================= +1) Fixed bug: #487883 Doesn't remember filename after save as +2) Fixed bug: #487859 Window title says [modified] after save +3) Fixed bug: #487860 After cmdline start, win title wrong + +14.12.2001, Olaf Hartig +======================= +BIG CHANGES +1) I rewrote the whole part stuff to have the internal data structures based on QDom. There are still some things open (marked with TODO) but it compiles and (surprise :-) works (at least here). +2) I restructured the directory structure (new directory ./part/ now) and reworked the build system (automake stuff). + +07.12.2001, Olaf Hartig +======================= +1) Slightly changed ./kxmleditor/action.cpp to make it independend of KXMLEditor classes + +29.11.2001, Mateusz Korniak +=========================== +1) Some changes in lodaing files specified by argument + - checking validity of given path + - fix loading local files ( 'kxmleditor file.xml' ) + +31.10.2001, Olaf Hartig +======================= +1) Added statusbar texts to some actions of the kpart +2) Slightly changed order of functions in ./kxmleditor/kxmleditorpart.cpp + +31.10.2001, Mateusz Korniak +=========================== +1) Few changes corresponding to valuable Ole suggestions. + +30.10.2001, Olaf Hartig +======================= +1) Changed the following things corresponding to my remarks about Mateusz first commits (see thread "Remarks to current DCOP implementations" from 2001-10-30 21:50) + - added KXE_TreeView::getSelectedPath + - added KXMLEditorPart::getSelectedPath + - changed return type of KXMLEditorPart::slotPathSelected from bool to void (because its a slot) + - removed all calls of KXMLEditorPart::m_pDCOPIface functions in the part, except constructor and destructor + - Slightly changed KXMLEditorPartIfaceReadOnly::selectNode and KXMLEditorPartIfaceReadOnly::currentNode to use KXMLEditorPart::getSelectedPath +2) Fixed bug in ./kxmleditor/kxmleditorshell.rc + +28.10.2001, Lumir Vanek +======================= +1) XMLEditorDoc::openDOM(QFile) - Fix for nonlatin1 symbols. + + +28.10.2001, Mateusz Korniak +=========================== +1) First code update heading for DCOP. +2) DCOP functions proposals for: quit, loadURL, selectNode, currentNode. + +********************************************************************* +* * +* 0.7.1 Beta released * +* * +********************************************************************* + + +25.10.2001, Lumir Vanek +======================= +1) Option "Append CR LF at end of line" moved to XML page, "Miscelaneous" page renamed to "Tree View". + + +24.10.2001, Lumir Vanek +======================= +1) Modifyied script make_rpm for creating RPM from command line. Is possible to use + this script for create RPM instead of KDevelop. + +24.10.2001, Olaf Hartig +======================= +1) Added the following new files for DCOP interface implementation: + - ./kxmleditor/dcopiface_app.h + - ./kxmleditor/dcopiface_app.cpp + +23.10.2001, Olaf Hartig +======================= +1) Added the following new files for DCOP interface implementation: + - ./kxmleditor/dcopiface_part_ro.h + - ./kxmleditor/dcopiface_part_ro.cpp + - ./kxmleditor/dcopiface_shell.h + - ./kxmleditor/dcopiface_shell.cpp + +18.10.2001, Olaf Hartig +======================= +1) Added a shell (new class KXMLEditorShell) which embeds our kpart + +15.10.2001, Olaf Hartig +======================= +1) Added slots for the actions to the kpart itself +2) Splitted KXmlEditorComboAction::slotClearEdit to slotFocusEdit and slotClearEdit +3) Added deselect action to the kpart +4) Added path toolbar to the kpart +5) Added possibility to show proc.instr. attributes (new class KXE_ViewProcInstr) to kpart +6) Added view of plain XML text for selected XML elements to kpart (new class KXE_ViewElement) + +12.10.2001, Olaf Hartig +======================= +1) Added configure action to the kpart + +11.10.2001, Olaf Hartig +======================= +1) Improved the behaviour of the OptionsDialog + - Added direct reading/saving of the configuration from/to the config file in OptionsDialog (new static functions: OptionsDialog::readConfiguration, OptionsDialog::saveConfiguration) + - Made the static members in OptionsDialog (the options itself) protected and added accessor functions + - Changed several files to use these new accessor functions +2) Fixed a bug in OptionsDialog::slotApply + Changes made on an currently invisible page weren't applied, now they are +3) Added saving of configuration to config file directly after changing it (see KXMLEditorApp::slotConfigurationChanged) + +7.10.2001, Lumir Vanek +====================== +1) Replaced all files in /admin subdirectory with new ones, generated KDevelop 2.0.1 + User manual creation now use meinproc instead of kdb2html. Index.docbook file updated. + Install libxml-1.8.11-53 or newer for creating doc (libxml2.rpm is available on www.suse.com). + +5.10.2001, Olaf Hartig +====================== +1) Changed copyright notes for every source file + +********************************************************************* +* * +* 0.7 Beta released * +* * +********************************************************************* + +4.10.2001, Olaf Hartig +====================== +1) Added treeitem_up action to the kpart +2) Added enabling/disabling of actions depending on status to the kpart +3) Added treeitem_expand and treeitem_collapse actions to the KPart treeview's context menus + +3.10.2001, Olaf Hartig +====================== +1) Added context menus to the KPart's treeview + +29.9.2001, Olaf Hartig +====================== +1) Added find and find_next actions to the kpart + +28.9.2001, Olaf Hartig +====================== +1) Removed KXMLEditorApp::slotExpandNodeAboutToShow and KXMLEditorApp::slotCollapseNodeAboutToShow and moved their functionality to KXMLEditorApp::initActions, because it's enough to initialize the popupmenus once +2) Fixed bug: Expanding/Collapsing treeviewitems to level 1 is now possible +3) Minimal changes in KXMLEditorApp to use the id of the menuitems of expand/collapse popupmenus +4) Added expand/collapse node actions to the kpart + +27.9.2001, Olaf Hartig +====================== +1) Added the 3 bookmark actions and its functionality to the kpart + +26.9.2001, Olaf Hartig +====================== +1) Added new file ./kxmleditor/kxmleditorpart.rc + +25.9.2001, Olaf Hartig +====================== +1) New class KXMLEditorAboutData, + - see kxmleditorabout.h + - use of this new class in KXMLEditorFactory::instance and in main +2) Added creation of attributes and contents view in the part + - KXMLEditorPart::m_pViewAttributes + - KXMLEditorPart::m_pViewContents +3) Cosmetic changes in tablewidget.h and tablewidget.cpp +4) Added functionality to update the attributes/contents view in the part depending on the selected treeitem + - KXE_TreeView::slotSelectionChanged + - KXE_TreeView::sigSelectionChanged( XmlElement * ); + - KXE_TreeView::sigSelectionChanged( XmlContentsItem * ) + - KXE_TreeView::sigSelectionChanged( XmlProcessingInstruction * ) + - KXMLEditorPart::slotTreeSelectionChanged( XmlElement * pItem ) + - KXMLEditorPart::slotTreeSelectionChanged( XmlContentsItem * ) + - KXMLEditorPart::slotTreeSelectionChanged( XmlProcessingInstruction * ) + - TableWidget::slotChange +5) Removed ./libtool from CVS , because it isn't needed there + +25.9.2001, Lumir Vanek +====================== +1) Removed KXMLEditorView::m_pSplitterVertical + +24.9.2001, Olaf Hartig +====================== +1) Changed the type of XmlStructureParser::m_pListWiew from XmlTreeView * to KListView * and the corresponding constructor parameter for XmlStructureParser, XmlProcessingInstruction, XmlContentsItem and XmlElement +2) Added first KParts code: + - added the files kxe_treeview.h, kxe_treeview.cpp, kxmleditorfactory.h, kxmleditorfactory.cpp, kxmleditorpart.h, kxmleditorpart.cpp and kxmleditorabout.h + - added lines to ./kxmleditor/kxmleditor.desktop + - changed ./kxmleditor/Makefile.am to make the shared library (libkxmleditor.la) and a binary (kxmleditor) + - changed the KDevelop Projekt Settings (./kxmleditor.kdevprj) to NOT modify the makefiles, because KDevelop can't handle making a shared lib and a binary in one project +3) Removed the following files from CVS, because they aren't needed there: + ./doc/Makefile + ./doc/Makefile.in + ./doc/en/Makefile + ./doc/en/Makefile.in + ./po/Makefile + ./po/Makefile.in + ./kxmleditor/.deps + +23.9.2001, Lumir Vanek +====================== +1) Implemented using DOM parser for opening XML + + +22.9.2001, Lumir Vanek +====================== +1) Prepared for using DOM parser + +********************************************************************* +* * +* 0.6 Beta released * +* * +********************************************************************* + +1.9.2001, Lumir Vanek +====================== +1) Added feature: #449114 Show attributes in tree view + +26.8.2001, Lumir Vanek +====================== +1) Fixed bug: #451510 element delete bug when Dragdrop +2) Added feature: #449139 Open xmlfile with specified element +3) Added feature: #449124 Shrunk mulitlined contents in tree-view + +26.7.2001, Lumir Vanek +====================== +1) Changed KXMLEditorApp::m_pActions (pointer) to m_Actions (stardart member) + +25.7.2001, Olaf Hartig +====================== +1) Renamed all actions in KXMLEditorApp to make them uniform +2) Added the structure KXMLEditorActions (new file: kxmleditoractions) and moved the pointers to the actions to it. Changed KXMLEditorApp to use this new structure. (This is useful, because i want to move some of the functionality from the mainwindow to the view). + +24.7.2001, Olaf Hartig +====================== +1) Clearing the path (location) bar with the toolbar button unselects the currently selected element. + +24.7.2001, Lumir Vanek +====================== +1) Added special characters support. This allow define list of spec. chars, that are not converted + using codec, when file is saved, but it's saved as hexa string. For example french oe ligature + is saved as œ + +23.7.2001, Lumir Vanek +====================== +1) Fixed session management bug. Now XML editor load file properly, when session is restored. + +2) In KXmlEditorComboAction::~KXmlEditorComboAction() comented deleting m_pCombo, because + this cause crash every time, when app. exiting. + +21.7.2001, Olaf Hartig +====================== +1) Merged the signals + KXMLEditorView::documentStateChanged and KXMLEditorView::selectedTreeItemChanged + to + KXMLEditorView::sigSelectedElementChanged + and the corresponding slots + KXMLEditorApp::slotDocumentStateChanged and KXMLEditorApp::slotSelectedTreeItemChanged + to + KXMLEditorApp::slotSelectedElementChanged + +2) Changed the information flow about the modification of the document + (added KXMLEditorDoc::sigModified and KXMLEditorApp::slotDocumentModified) + +20.7.2001, Olaf Hartig +====================== +1) KXmlEditorComboAction handles its combobox now on its own. + +2) I removed the special handling of bookmarked elements in the path combobox. + I removed the signals KXMLEditorView::comboInsertPath and KXMLEditorView::comboRemovePath, + cause there's no need for them anymore. + +3) I renamed the actions in the path toolbar to make them uniform. Now they are: + path_clear + path_label + path_combo + The file $KDEHOME/share/apps/kxmleditor/kxmleditorui.rc needs to be removed by + the users. + +18.7.2001, Lumir Vanek +====================== +1) Added support for XML encoding. While saving, codec selected based on + proc. instruction . + +2) Transparent KOffice files handling. Added page to Configure dialog, for + editing list of extensions, that is TarGz files. + +********************************************************************* +* * +* Alpha * +* * +********************************************************************* + diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..c5fe786 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,266 @@ +# Doxyfile 1.3.7-KDevelop + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = kxmleditor.kdevelop +PROJECT_NUMBER = $VERSION$ +OUTPUT_DIRECTORY = +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = /home/lvanek/Projects/Own/kpogre/ +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = /home/lvanek/Projects/Own/kxmleditor +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.C \ + *.CC \ + *.C++ \ + *.II \ + *.I++ \ + *.H \ + *.HH \ + *.H++ \ + *.CS \ + *.PHP \ + *.PHP3 \ + *.M \ + *.MM \ + *.C \ + *.H \ + *.tlh \ + *.diff \ + *.patch \ + *.moc \ + *.xpm \ + *.dox +RECURSIVE = yes +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = yes +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = kxmleditor.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 1000 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..02a4a07 --- /dev/null +++ b/INSTALL @@ -0,0 +1,167 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes a while. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Type `make install' to install the programs and any data files and + documentation. + + 4. You can remove the program binaries and object files from the + source code directory by typing `make clean'. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/KXMLEditor.flw b/KXMLEditor.flw new file mode 100644 index 0000000000000000000000000000000000000000..9a2d854f910da9d8c1a59b07afe15978632e244c GIT binary patch literal 2506 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 UAN4k7c(>>OfAQdkBLHLo03*5IkN^Mx literal 0 HcmV?d00001 diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..1fa9998 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,29 @@ +####### kdevelop will overwrite this part!!! (begin)########## + +SUBDIRS = part kxmleditor po doc + +EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README TODO kxmleditor.lsm admin + +####### kdevelop will overwrite this part!!! (end)############ +# not a GNU package. You can remove this line, if +# have all needed files, that a GNU package needs +AUTOMAKE_OPTIONS = foreign + +$(top_srcdir)/configure.in: configure.in.in $(top_srcdir)/subdirs + cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure.in ; + +$(top_srcdir)/subdirs: + cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common subdirs + +$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in + @cd $(top_srcdir) && cat admin/acinclude.m4.in admin/libtool.m4.in > acinclude.m4 + +MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files + +package-messages: + $(MAKE) -f admin/Makefile.common package-messages + $(MAKE) -C po merge + +dist-hook: + cd $(top_distdir) && perl admin/am_edit -padmin + cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs diff --git a/Makefile.dist b/Makefile.dist new file mode 100644 index 0000000..be59a86 --- /dev/null +++ b/Makefile.dist @@ -0,0 +1,14 @@ +all: + @echo "This Makefile is only for the CVS repository" + @echo "This will be deleted before making the distribution" + @echo "" + @if test ! -d admin; then \ + echo "Please recheckout this module!" ;\ + echo "for cvs: use checkout once and after that update again" ;\ + echo "for cvsup: checkout kde-common from cvsup and" ;\ + echo " link kde-common/admin to ./admin" ;\ + exit 1 ;\ + fi + $(MAKE) -f admin/Makefile.common cvs + +.SILENT: diff --git a/README b/README new file mode 100644 index 0000000..58af37c --- /dev/null +++ b/README @@ -0,0 +1,22 @@ +Thank you for downloading KXML Editor ! + +KXML Editor is Open Source Software and developed under the GPL (see COPYING for details). + +==================================================================== + +KXML Editor is KParts application, and it must be installed properly to KDE directories. + +Before ./configure, make and make install process, use + +export KDEDIR=/opt/kde3 +export QTDIR=/usr/lib/qt3 + +Of course look where is KDE and Qt path in your system and use correct directories. + +If you experience startup crash, check if library libxmleditorpart.so.1.0.0 +is exists in KDEDIR/lib directory. + +======================================================================= + +Lumir Vanek +lvanek@users.sourceforge.net \ No newline at end of file diff --git a/TODO b/TODO new file mode 100644 index 0000000..a116bd7 --- /dev/null +++ b/TODO @@ -0,0 +1,2 @@ +Need fix: ++ documents with namespaces in attributes are not displayed properly when opened again diff --git a/configure.files b/configure.files new file mode 100644 index 0000000..030bce8 --- /dev/null +++ b/configure.files @@ -0,0 +1,2 @@ +./admin/configure.in.min +configure.in.in diff --git a/configure.in.in b/configure.in.in new file mode 100644 index 0000000..9a5fee9 --- /dev/null +++ b/configure.in.in @@ -0,0 +1,4 @@ +#MIN_CONFIG + +AM_INIT_AUTOMAKE(kxmleditor,1.1.4) + diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..05a9fba --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,6 @@ +####### kdevelop will overwrite this part!!! (begin)########## + +SUBDIRS = en + +####### kdevelop will overwrite this part!!! (end)############ + diff --git a/doc/en/Makefile.am b/doc/en/Makefile.am new file mode 100644 index 0000000..e1a4f66 --- /dev/null +++ b/doc/en/Makefile.am @@ -0,0 +1,10 @@ +####### kdevelop will overwrite this part!!! (begin)########## + + +EXTRA_DIST = index.docbook screenshot.png xml.png setuptargz.png setupprintout.png setupdefaults.png setuptexteditor.png setuptreeview.png specprocinstrdlg.png texteditor.png kparts.png + +####### kdevelop will overwrite this part!!! (end)############ + +KDE_LANG = en +KDE_DOCS = kxmleditor + diff --git a/doc/en/index.docbook b/doc/en/index.docbook new file mode 100644 index 0000000..8785a5d --- /dev/null +++ b/doc/en/index.docbook @@ -0,0 +1,1502 @@ + +KXML Editor" > + + + +]> + + + + + + + + + + +The KXML Editor Handbook + + + +Lumir + +Vanek + +
lvanek@users.sourceforge.net
+
+
+
+ + + +2004 +Lumir Vanek + + + +&FDLNotice; + + + +07/08/2004 +1.11 + + + + + +KXML Editor is an application for browsing and editing XML files. + + + +This document describes KXML Editor version 1.0. + + + + + + + +KDE +KXML Editor + + +
+ + + + + + + + + + +Some Fundamentals + +Extensible Markup Language (XML) is wide standart for exchanging and +transferring data in application development. XML stores character data +in a structured way, using tags placed within the data representing its structure. +An XML document has a tree structure, where "XML element" tags comprise the nodes. +The "root element", begets all the other elements in the tree. All elements except the root +have a single parent. Elements may contain character data - "XML contents". +An element node may also own a list of "attributes". + + + + +XML structure + + + + + + + + + +You may obtain more informations + about XML on Web. + + + + + + + + + + + +Introduction + + + + +KXML Editor is a program that lets you browse and edit XML files. Main window is divided +to two windows. + + + +Left side contain tree widget with XML structure. XML document has tree structute, one (and only one) +element is root. Every element may own one or more childs elements or contents items. + + + +Right side contain detail for selected item. If XML element is selectected in left side, +attributes list and raw XML are displayied. If XML contents is selectected in left side, edit widget with full +context is displayied. + + + + + + +Here's a screenshot of &kxmleditor; + + + + + + + + + + +KXML Editor contain two toolbars with buttons - one with standart commands and second with +commands for edit XML document. Third toolbar contain Konqueror-like path bar, that display +path of selected XML item. + + +The Pathbar shows the path to the selected XML item, +You can type a path here and press Enter to go to it. +You may use combobox in path bar for select bookmarked item. +The black icon at the left hand end of the Pathbar clears the text entry box. + + + + + + + + + + + + +Edit XML document + + +User may edit XML document using menu commands, or using drag and drop. + + + +Moving elements using clipboard or drag and drop has one side effect to +bookmarks system. Moving elements and their subtrees leave its paths in +Pathbar combobox nonvalid. + +When you cut/copy and paste items with bookmarks, or drag and drop it, bookmarks are not +transfered. + + + + +Using clipboard + +To copy a XML element or contents item you can: + + + + +If the item is selected you can use the +Copy button on the Toolbar or the Menubar +Edit Copy +item, or the CtrlC +hotkey. + +Then select item, where you can copy XML element. + +Finally, use Paste button or the Menubar Edit +Paste option or the CtrlV hotkey. + + + + +Moving a XML element or contents item can be done in the same +way as copying, except that you choose the Cut option +or CtrlX +instead of Copy. + + +You can also exchange XML between &kxmleditor; and text editor using clipboard. Of course, +when you paste XML element, clipboard must contain well formed XML. + + + + + +Using Drag 'n Drop + +&kxmleditor; supports Drag and Drop copying and moving of elements and +contents items. + + +Set the tree view to show the item you wish to move. If you can copy, +press Ctrl button and hold it. + +Position the mouse pointer over source item name or icon then, holding the &LMB; +pressed, drag it over to the tree view and position the +mouse pointer over the target item. Release the mouse button and Ctrl if you +made copy. + + + + +You can also drag and drop between different instances of &kxmleditor;. Also is possible drag from +&kxmleditor; and drop into text editor. + + + + + +Encoding + +&kxmleditor; supports XML document encoding. + + +When file is loaded, parser get information about encoding from processing instruction + <?xml encoding="xxxx" ?> and convert XML to Unicode. + + + +&kxmleditor; works internally with Unicode strings. + + + +While saving, &kxmleditor; convert XML from Unicode to encoding that depends on processing +instruction <?xml encoding="xxxx" ?>, where xxxx may be ISO-8859-1, ISO-8859-2, UTF-8 etc. +If you change encoding, you change codec, that is used while saving. + + + + + +KParts + +&kxmleditor; supports KParts technology. + + +If you browse directory using Konqueror, you may select XML file and click on it by right +mouse button. Then you may choose menu item Preview in +and KXML Editor that starts KXML editor inside Konqueror +main window. + + +Special processing instruction dialog + + + + + + + + + + + + + + + + + + + + + + + + +The Menu Entries + + + +The <guimenu>File</guimenu> Menu + + + + +CtrlN +File +New + +Creates a new XML document. If there is a current document +with unsaved changes the user is given a chance to save it. Program show dialog for +special processing instruction, you may choose XML version and encoding. + + + + +Special processing instruction dialog + + + + + + + + + + + + +CtrlO +File +Open + + + +This command opens a file. It does this by means of a dialog box +which allows the user to navigate the file system. The dialog operates +like a small file manager. Clicking on directories displayed in the +central window directs the dialog to enter that directory - displaying its +contents. There is an entry/dropdown box which can be used to type in +directly the location and name of the file or by clicking the arrow at the +side choose from a dropdown list of recently used locations. Below this is +a filter which similarly may have data entered directly or chosen from a +dropdown list of recent filter types. The filter facility lets only files +that meet its specifications be displayed in the central window. If the +filter contained text such as *.xml then only files +with the txt extension would be visible in the selection window. Below the filter +is a status bar giving information about the number of files and subdirectories +within the current directory. + + +The toolbar, which is located at the top of the dialog, has left and right +arrow buttons that let the user move back and forth through previously selected +directories as well as an up arrow button for moving up the directory tree. The +button with the little house takes the user to his or her home directory and the one +with the two arrows curved in on each other updates the view of the current +directory. The flag button lets the user set a new bookmark at the current directory +or go to one that was previously set. + + The last button on the toolbar allows you to create a new +directory, and finally there is dropdown box with a list of some commonly +frequented directories. + + + + + + + +File +OpenRecent + + +This is a shortcut to open recently saved documents. Clicking on +this item opens a list to the side of the menu with several of the most recently +saved files. Clicking on a specific file will open it in &kxmleditor; - if the file +still resides at the same location. + + + + + +CtrlS +File +Save + + +This saves the current document. If there has already been a save of the document then this will overwrite the previously +saved file without asking for the user's consent. If it is the first save of a new document the save as dialog +(described below) will be invoked. + + + + + +File +Save As + + +This allows a document to be saved with a new file name. This is +done by means of the file dialog box described above in the Open + section of this help file. + + + + + +File +Mail + + +This allows mail document using your mail client. + + + + + +File +Version & Encoding + + +Program show dialog for special processing instruction, you may choose XML version and encoding. + + + + + +File +Attach Schema + + +This allow to attach DTD schema file. + + + + + +File +Detach Schema + + +This allow to remove DTD schema file. + + + + + +File +Attach Stylesheet + + +This allow to insert processing instruction for ataching schema (obviously .xsl or .xslt) file. + + + + + +File +Detach Stylesheet + + +This allow to remove processing instruction for ataching schema. + + + + + +File +Print + + +This allow print document. + + + + + +CtrlQ +File +Quit + +Quits &kxmleditor; + + + + + + + + +The <guimenu>Edit</guimenu> Menu + + + + +CtrlZ +Edit +Undo + + +This is used to eliminate or reverse the most recent user action or operation. + + + + + + +CtrlShiftZ +Edit +Redo + + +This will reverse the most recent change (if any) made using Undo + + + + + + +Edit->Undo/Redo History + + + +This will call a display box showing a list of the most recent actions on the left and another list of actions which have been 'undone' on the right. +There are also three buttons at the right of the box labeled Undo, Redo, and Close. +Clicking on the Undo button will cause the action at the top of the Undo list to be reversed which will place that particular action at the top of the Redo list. +Likewise, clicking on the Redo button will reinstate the reversed action and move it back to the top of the Undo list. Clicking on an item below the top item in either +list will select all the items from the top down to that point. A subsequent click on the corresponding button will cause all the selected actions to be undone or redone accordingly. +This would be particularly useful when the user knows precisely the point to which she or he would like to proceed - making it unnecessary to go through a series of single undo or redo actions. + + + + + + +CtrlX +Edit +Cut + + +This command deletes the current selection and places it on the clipboard. The +clipboard is a feature of KDE that works invisibly to provide a way to transfer data between +applications. + + + + + +CtrlC +Edit +Copy + +This copies the currently selected text to the clipboard so that it may be +pasted elsewhere. The clipboard is a feature of KDE that works invisibly to +provide a way to transfer data between applications. + + + + + +CtrlV +Edit +Paste + + +This will insert the contents of the clipboard at the cursor position. The +clipboard is feature of KDE that works invisibly to provide a way to transfer +data between applications. + + + + + +Del +Edit +Delete + + +This will delete selected XML node, including their child subtree, if any + + + + + +Edit +Delete all attributes + + +This will delete all attributes that contain selected XML element + + + + + +Edit +Move Up + + +Move selected node Up, in their parent list + + + + + +Edit +Move Down + + +Move selected node Down, in their parent list + + + + + +CtrlE +Edit +Deselect node + + +This unselect node + + + + + +CtrlF +Edit +Find + +This opens the find dialog which is used to specify the Text to +Find in the document. There is small text box for entering the search +pattern. Other +parameters are included to make the search more efficient. Selecting +Case Sensitive will limit finds to entries that match the +case (upper or lower) of each of the characters in the search +pattern. + + + + + + +F3 +Edit +Find Next + +This repeats the last find operation, if any, without calling the find +dialog box. + + + + + +Edit +Properties + + + +Display dialog which allows the user to change selected node properties. Dialog type +depends on selected item type. + + + + + + +Edit +Edit raw XML + + + +Display dialog which allows the user to edit selected element as raw XML. + + + +Special processing instruction dialog + + + + + + + + +You may press Validate button for checking, if XML is well formed. + + + + + + + + + + + +The <guimenu>View</guimenu> Menu + + + + +AltUp Arrow +View +To P arent node + +Go up a level in the tree hierarchy. Select parent node. + + + + +CtrlPlus +View +Expand node + + + +Expand selected XML element and show entire child subtree. + + +Tip: You may expand node to choosed level. Press button for this function on toolbar, +hold mouse pressed for small anmount of time. Program show menu, which allows the user to +expand node to selected level. + + + + + + +CtrlMinus +View +Collapse node + + + +Collapse selected XML element and hide entire child subtree. + + +Tip: You may collapse node from choosed level. Press button for this function on toolbar, +hold mouse pressed for small anmount of time. Program show menu, which allows the user to +collapse node from selected level. + + + + + + + + + +The <guimenu>Insert</guimenu> Menu + + + + +CtrlShiftE +Insert +Element + + + +Insert new XML element into tree. Display dialog which allows the user to enter element name. +If you have void document, new element becomes root. If you have selected any existing element, +new element becomes child of this element. You may decide, if new element will be placed to +begin or end of childs items list. + + + + + + +CtrlShiftA +Insert +Attribute + + + +Insert new XML attribute for selected XML element. Display dialog which allows the user to enter +attribute name and value. Attribute name is checked for duplicity before inserting into +attribute list. + + + + + + +CtrlShiftT +Insert +Text + + + +Insert new XML text item into tree. Display dialog which allows the user to enter contents text. +New item becomes child of celected XML element. You may decide, if new item will be +placed to begin or end of childs items list. + + + + + + +CtrlShiftD +Insert +CDATA + + + +Insert new XML CDATA item into tree. Display dialog which allows the user to enter contents text. +New item becomes child of celected XML element. You may decide, if new item will be +placed to begin or end of childs items list. + + + + + + +CtrlShiftC +Insert +Comment + + + +Insert new XML comment item into tree. Display dialog which allows the user to enter contents text. +New item becomes child of celected XML element. You may decide, if new item will be +placed to begin or end of childs items list. + + + + + + +CtrlShiftP +XML +Insert proc. instruction + + + +Insert new XML processing instruction into tree. Display dialog which allows +the user to enter target and data. + + + + + + + + + + + +The <guimenu>Bookmarks</guimenu> Menu + + + + +CtrlB +Bookmark +Toggle bookmark + + +This creates a marker in the document at the selected item. Bookmarked item path as added +into Pathbar combo. User may traverse bookmarks using +Previous or Next Bookmark command, +or directly select bookmarked item in Pathbar combobox. + + + + + + +ShiftF5 +Bookmark +Previous bookmark + + +Move selection to previous bookmark in document, relative to selected item. Bookmarked items, +that are closed is skipped. + + + + + + +F5 +Bookmark +Next bookmark + + +Move selection to next bookmark in document, relative to selected item. Bookmarked items, +that are closed is skipped. + + + + + + + + + +The <guimenu>Settings</guimenu> Menu + + + + +Settings +Show Toolbar + + + +When checked, this displays a movable toolbar containing buttons used to +initiate frequently used commands. When unchecked the toolbar is hidden. + + + + + +Settings +Show Statusbar + + +When checked, this displays a small bar at the bottom of the main window +containing information about the status of the current document. When unchecked +the statusbar is hidden. + + + + + +SettingsConfigure Shortcuts + +This command opens a dialog box whereby the key bindings may be changed. +A display window at +the top of the dialog box shows the list of commands (actions) that can have +keyboard shortcuts. Below the display are three radio buttons. The user may choose +between No Key, Default Key, and Custom Key. (Note that a set of radio buttons only +allows the selection of one of the offered items - in the way that buttons on a car +radio only offer the selection of one preset station. Also, the Default Key +selection is only available for those commands that actually have a 'default' +shortcut.) Selecting the Custom Key option activates the three check boxes and key +button at the bottom of the dialog. The user may then select a key +combination for the command in question by means of the check boxes and key +button. For example, with the About KDE command selected in the display window, +the user could select Ctrl and Alt, click on +the key button, and then press the K key on the keyboard. This +would mean that anytime he or she held down the Ctrl and +Alt buttons and pressed K (while using +&kxmleditor;) the About KDE display box would be called. + + + + + +Settings +Configure Toolbars + +This will open the dialog whereby the toolbars configuration may +be changed. The user can choose which shortcut buttons should appear on the +toolbar. A display window on the left lists the commands available to placed +on the toolbar. A display on the right lists those commands already on the +toolbar. A set of four arrow buttons between the two displays manipulates the +selections. The right pointing arrow places any command selected in the left +pane onto the right pane, i.e., it is added to the toolbar. +The left arrow does just the opposite, removing any action selected in the right +window from the toolbar. The up and down pointing arrows change the position of +an action selected in the right window which changes the position of its button +in the toolbar. + + + + +Settings +Configure &kxmleditor; + + +This menu item opens a dialog whereby several different settings may be adjusted. + + + + + + + + +The <guimenuitem>Help</guimenuitem> Menu + + + + +F1 +Help +Contents + + +This invokes the KDE help system starting at the &kxmleditor; help pages (this document). + + + + + + +ShiftF1 +Help +What's This? + + + +This changes the mouse cursor to a combination arrow and question mark. +Clicking on items within &kxmleditor; with this arrow will open a help window (if +one exists for the particular item) explaining the item's function. + + + + + + +Help +Report Bug + + + +This calls a dialog box to help +the user help the KDE team to track down and solve any +problems(bugs) in the program. The dialog attempts to do this by +means of email using the information given by the user. + + + + + + +Help +About KXML Editor + + +This will display version and author information. + + + + + +HelpAbout KDE + +This displays the KDE version and other basic information. + + + + + + + + + + + + + + + + +Configure &kxmleditor; + +Selecting +SettingsConfigure +KXML Editor from the menu brings up the Configure-KXML Editor +dialog box. This dialog can be used to alter application settings. By means of four buttons +along the bottom of the box the user can control the process. She or he may invoke +the Help system, accept the current settings pressing Apply button, +accept the current settings and close the dialog by means of the OK button, or +Cancel the process. + + + + +Tree View +This category deals with following properties detailed below. + + + +TarGz Extensions + + + + + + + + + + + +Set root element decorated + + +Set the root element in tree view decorated. +Sets this view to show open/close sign on root item. + + + + +Default expand level + + +Set the default expand level for tree view. + + + + +Enable drag & drop + + +Enables or disables drag & drop. Disabling it may be useful, when X-Window client +and server is not on the same machine and respond time is slow, that may cause unnecesary +drag & drop operation caused while selecting in tree view. + + + + +Show... + +This option allow display XML attributes for each element in left side tree window. +You may choose one of this options: Show only element name or Element, attribute name +or Element, attributes names and its value. + + + + + + + + + +Defaults +This category allow set default XML version, encoding and program behavior +while creating new document + + + +Defaults + + + + + + + + + + + + +XML version + + +Default XML version for new documents. + + + + +Encoding + + +Default XML encoding for new documents. + + + + +Creating new files + + +Behavior when creating new XML documents. + + + + + + + + + + +Printout +This category allow set parameters for printing XML document + + + +Printout + + + + + + + + + + + + +Font family + + +Choose font family for printing document. + + + + +Font size + + +Choose font size for printing document. + + + + +Element intendation + + +Choose element intendation for printing document. + + + + +Print header + + +Choose if you can print header when printing document. + + + + +Print footer + + +Choose if you can print footer when printing document. + + + + + + + + + + +TarGz Extensions +This category allow set list of XML files, that is TarGz archives. +This allow open and save those files transparently. This may be useful +for browsing KOffice files. + + + +TarGz Extensions + + + + + + + + + + + + +Archive files extensions + + +You may edit list of files extension using New and Delete buttons. +Actually selected item may be changed using edit line. + + + + + + + + + +Text Editor +This category allow set text edior syntax highlighting + + + +Text Editor + + + + + + + + + + + + +Syntax highlighting + + +You may choose various colors for different XML syntax. + + + + +Element intendation + + +Choose element intendation for raw XML editing. This intendation is used also for saving document. + + + + +Wrap, instead of Hrz. Scroll bar + + +Disable horizontal srcrollbar and set word wrap ON for raw XML view and editing. + + + + + + + + + + + + + + + + + + + + +Credits and License + + +&kxmleditor; Program copyright 2001-2003 the &kxmleditor; developers: + + + + + +Lumir Vanek lvanek@users.sourceforge.net +Developer and maintainer + + + +Olaf Hartig hartig@users.sourceforge.net +Developer + + + +Adam Charytoniuk a_charytoniuk@users.sourceforge.net +Developer + + + + + +Documentation copyright 2003 Lumir Vanek lvanek@users.sourceforge.net + + + + +&underFDL; + + + +&underGPL; + + + + + + + + + + +Installation + + +How to obtain KXML Editor + + +You may obtain &kxmleditor; from URL: +http://sourceforge.net/projects/kxmleditor. + + + + +Requirements + + + + +In order to successfully use &kxmleditor;, you need KDE 3.1.x or higher. +For instructions on acquiring &kde; please see http://www.kde.org. + + + + + +Compilation and installation + + +In order to compile and install &kxmleditor; on your system, type the following in the base +directory: + +% ./configure +% make +% make install + + + +Since &kxmleditor; uses autoconf and automake you should have not trouble compiling it. +Should you run into problems please report them to author. + + + + + +&documentation.index; +
+ diff --git a/doc/en/kparts.png b/doc/en/kparts.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c1663c0a81c5923b148c109f0ecb0c354c7aea GIT binary patch literal 124983 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

*ui3wJ$dL%hdC=)Vi600D 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

vSVAd@v6C-a#{ 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�l>LX>8aA|6*|f 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 literal 0 HcmV?d00001 diff --git a/doc/en/screenshot.png b/doc/en/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7a965ff9c2917f6de77db4bd1af7df4688a9b8a2 GIT binary patch literal 100110 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 literal 0 HcmV?d00001 diff --git a/doc/en/setupdefaults.png b/doc/en/setupdefaults.png new file mode 100644 index 0000000000000000000000000000000000000000..59e1917cc95da2ea5afe1701efa4c7dc62102170 GIT binary patch literal 37047 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 z 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

k(!q;@))5{}{f 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 literal 0 HcmV?d00001 diff --git a/doc/en/setuptreeview.png b/doc/en/setuptreeview.png new file mode 100644 index 0000000000000000000000000000000000000000..ce50d8312496633c0d39070384c64c6e28e1392b GIT binary patch literal 35871 zcmbTd1yCGO*DX3ofCLS00g_9so;Y^bRc=@cUs;Vf0tbBiLA3E9tDhXCB$lZ3ZX3b8}D|9%tN2GxQA+9eqFk( z5#s3_%pYFPaAp!nyaW_psgK*2PmYMR5e)FD%*kwFVM^xw0vEBfkDHZG7B3V$-N znQzjYBR71_c*|$T_S{3ZdqR}(^~s$%wK?_T(>HN*H?0=XlXdGXA1kx_ld}=<*sA*) zFV@SiaU~Z%YiHV^k1H#XX2!1sk`T^E$Mf5pUX9t@I`~p%_=+&whEV`a$xa^YrG?OM zUWejRwFs^tQc0|r=;R{chU1X~)kgew0dKi8vi@15rjP(pldT;JB;KTZ3ws6UrGWjj zNmTaVlI(1th%rKJe?;cJPwn=If(KZ3Z(=E3Xr`#g7;}L0C)n67jm|upSAgkdvI~3P z6o~ydD!bOcBun7#7@E0tKVdclMhsrkO>7qUdih5pdxvxQsR(=RT-V&6M!XbUD{)4e zp#Jh^Q!8-KHidmT(mcC@;kxbF$9eDm*aMW#EZjm- zbR-#p;f>_8iwyF85f9D6 z&wCK2D@Y>8oO)=1$-u^>~fbT@cZIsrKvw&Q6rZVB`I419q% zyWY=~H0V=ojmDe0Q%8NEah?yi7uuydn|Ucj%Ui;yiSO@T2QF3JimTW(zl2F6+cYc^ z^-M8Yo;%;)=%`DNMQ|TPqWrkCE-nb4*Aghm0nxR%RR}E`C zq(yh$Ddw`5UZG_-V4eCQ*u~cLP8Z=R63fV=%ZlU?%Ph{22*RNtT5Px`hQ7F7CG{P7 z`jT%L{;=ORmaf`z-jTwx!8xK^bgt)Faop|o-G~&nn?ccHdt3L_B7G!`87A}YOL@py z5@WQL*E^F}nm?gGZEb#iaOod)4K?Zr%%ojh7p*Yv5EqadCN&18^bk4SboFVaxcZOV zZeDh@Tr9)=(peqHusVY-G0Kmlskvh^8_BxTZ!Ym&-`VTQ*LEmQHjjFR-@=u`Ge}$j+@G&vGS(< z4T-j?Ti~R0WF$?H_$yd%0$=uQ#gRaR#M+Us7rj{dHc@@lIC4lZc#bG%PV-MhW%Q%! z0QM|p_KXy+Bj_`Rm+vjV*KNK1iSm6xk1yx#O?yN4`F)qmEe*GyH!ITPRPL|rJ7dNs zNbVE8AEA4Oouf^ouu&xcV`E1&a#WW?X@L4h+L~lr{ai==(Le02!w>ne(k9X2J9N+N z2rb7ywZTPvb$}L(2N@~BxlYouhA1J$>0sd|E9cI&Eq6U!bj%ehHs2&fzX3`tx{198 z=Z&L9tQSay0_Tc&1zp){&w|aqWFtn!p>?e9$~DcZG4UQ zV*}!xN@Z%|k?a6v`;ANtS9L@>7ex>`|fTQ)U$5^L2Ezfo_LL^Ul z^CsLO`j_7G&YeEQmEXOAOC0F;18@ouCsM{gwHpz4z3lEOVt1aReEE%He>G<#U%zo! zwbwH%bJI5;wnEl6z1i64K?`l=*f-6csbhDvHdLg-r_vaJ|RLY zRn+yuR_#`fNw|^SAK#H2sqGi&L!W;j=uPgv9!SON`( zXRm+F9P5Azi3*29DG<~nEX4KSdRvj2=fWt{NlPYdVwn?#OcP|hS@MO2%3|hRS-}p_ z$X}Lxrlp`cO(#;Z49RD&b%(sIK9Yil`V?k{w$(vD3&0=^O-7JU^bTahKg``KD;`@0 z^+M&drRu5ns?Ce{d3?95SD3h>59U|`~ z@vmwj3f!!!oJ3WSo9DY785~M)x;U!MPW0V=d39SX&m7OxY<_6^v_PB+Q90eMwpgHk zC{2D`;B^=}|H=|I>?Jr}%G^rg(vB{Ln>@e)!SndO8io62cCwiO-W*Yvg^%&aIGeXt zfaK$~4$M_!61r239=yyX*@Y``5O_rN4jNIdxegMhb#R{@lG$f0Ja1rsjIv1*85gYF z&|>saccZxhdwv%aY&@OS-8&4_`|(7tscm~C;~fRud>_BT@u6#`n|LH%)tyHqHn%bI zbQ|n{y^Sw%e-?f-O~wn_U_@2YRnRYp=j&J2HGiiZ?d6QeW1Ru|NQZ=XV!2=@S@jrJU%gu^^OyXBQ@g}FP3aqhd6v=zf1PY>jOw_dc zGn}wFBCz2fZL$0-iIzcX7Sa2Mb0P%4=pgob0Ke`c2%-?=!1Y62Td(1|RpLOx+4k?o zn4VulxM|*5H9;_1p#r|r#~)ps6JoL9myY;8dmCBle#hsmkQyD)$3(2gocEUcR72kv z27StJP%h5L7Bk;dUlxloC49%OHav>K5RF6{`5gBR&dg$(uKxy`E>+=WD4@={v2mZ; z+S&bHxl%7V-q7SJUw5IO$Zz>5()c9m3uH~Lrg!kJ0Jo%aIWx${!sj%X-<#t_K$*+Y zWt@J3-?p?`xVZjlg&dXBopCsUhDVdf`r_90>Pc==!cC@q@^=;mQE~6qPf{ce8ts;z z;bM0xt?S3{Z5RIf^KxBFp5<7lrSq5cY)^pJjBO9Xm~U!L%TL@7pu;plAhF}6e4^T3KN}fqt#43wwbLv zfr^g$B6xWEq(D8MOZ?Li9*}dPaQ?BIfASHSj3f;+%MG;_NVdqUh+hEhkDt7ebF!#`WH zNk4ribsP|?1(Kta@CDzMORY%ein@(se;V;}QA{gBxPk(|tzi(mZs^sqB~J(SzcBUR zhfxgQb8bHi}mv7p8Efs zw$+k7Kicf+wUpx}zTWQ}1b^5h*{hZnw5IcgPnS4&&$9GF*kM;*xayE9HZ z4}qt}8jbuQ^eG;FnqLn;vFz~#v5Vb`?-d!V7F#X`*W=qm0wTt#yqHw|6Pzb9qj@~j z8=G*-ZuKvu_WKgyPU={Wrm-z_UY14Q@SsEP!a)fUouB+EwQ(^FXFPn^C)1s zzrTO^q3uSz&UM$PMDD`j917m*4SmXF>F!SacKDJM)T|W;O!7IsIa5j!_Q7V%T*?n77y)xzDAghMFBX0KEGWFg@8zeOlwsjbPnT%nAo-JjELAR(CoptUaHge)d5Me~s%a&V=Z0*w%y=LYhgvh8l0=#~-ysf~RhX zgV8EqILm(f$ytE%b8^>pS0q4I}Bi@8h48kT1% zw__|7RSnN}*WrjHsQCm#p}X%9Z@uo8)Tvtj&N1fQuLH(wpQ>+C1hUunDC?W&68xa1 zrNcFKoXv^tPd=>-9vmb{<}A_lbBFWd3tN{M9+?Ow97jCHj`xgkMsoA=MSc8^0Po|6 zcO#c?Ib35&3r`<8ejcAPPzN1dA7l3P(Bc%r^YMV6oR91bX7Ad1NgiUMfQ|x>C-N2H z^4C7>WA8D7jn_Z6O(i$!w+C2P%3XkVmM0I~@nf>71S-?Ij-CvRMW-lb>q~A_54O)< zUUW>435_*|lh!;1<;Y16aVGRIg#}Or*oOQfrxNDg_?c4bY{vV1nKUN0ALW|=ddmvS z9*4f;Jzfyk-@5!T335+DRx*v81Z=IGuaAv)+OfVs?AE_=u=BRNm2^Q%0dgG{2u3VEk3TM0<#&yN+E@6m1_ z1-?`3QUl4pn?OvjXZP!8eR9D#Pf_F?5>h2a5GL&_WbBlvB?aXfC(whU(RBy2*gB!~7cAur5v3x+2LBTJ z1{m=-J84iAj-4zLF0nF}#NQHLa$Ct{NVN|@#UeOisIxMFPpvc9h2g;Dzfq^x!(-Hn#QRP+y zpy4W|7xOsV0vt4v#}?v290?~sYaP{ZPwVW1G=Qph!O_#!1$D!tFyp0v7>hB0qKNVZ~=Z|M(LqdkpHD?6o9(0_z$d zJ_7_+e3~tk-Gk&X%knPq3-DfAxqbxF{LE{t=0W}))=S0Q0$DI=Uv0OL_%$C~Xcp{y z`?(>%DT_O}r*#r$@?M}S87kD+# zXY>(X6K(OazsLDM6IU5#YiGpzaa>~qhkbG@RPJwrD&#v_Salh|=kI&ioHc))(oo8? z1F+(amdN(V)&$tMT!mLD9zYh)rd5XRE6&jz>bX5#IBcQMCEw>P2w6Aes{PLbgV6>f zCI7AOPlEc962ganiz_+BQ>t+OZy}$l1NC}b^%-zsX`qZq|Ns8su$`l9zx4W5Cc{c| z8`V;a*i@|;FPHH6g(E`#sdrMfas7VS=7UYgg%R;AohRE$m9pEvU6ErcVE6b@*h^w3 zPIahbBYEayRE|ZnwO^5C?ZSm42g9itN#`n=jddQPeJQ=QoH^m&^fsq?))5Q0wPypS9?Eh=S5c+ z_JrcLi+t4s;GM>&`TCKqM#=%>sKMMF&j`6d8mljJ$lay^b}#W6X8FJKjq3@Dq7P>f z*se?;4%1|`E%T`uA76e8157=cZ|S}2J_sYruAdJlQ#pl|CGg$Z3TrrJ(p1v&+z$|z z4>1U38ka86sAY1%WISHURbI)207R9X4I3RT6AFp|A`C}s^HV=Ct&`o{;(4`}fgKK#SWxXycJS&>;X3F`2|C@S zyC85Nb@Jq%l^iDQo^VEYOY(sG=RWv;YFmSBynp+ID~S!yYBN&7U~rXEk|uwA9fRvw zSNPUDZ;bu!D0zTyX+*E7hx8$_n^)NYO~?H2Na`f2IqEt;rvaWAA!?^GoI&MJ6oCc_ zWLBv535>sm?ie1J+M4HZO4b}n-?-_3rT0p(6y901DN%izy0$GO%_sk>ld^ue+w89SF!0Ezw4 z?AeNXBd_7D?|n3O^~;U2eK>A*Uo2Cw+;=L!;yt&6!Xo9e@9so?e#M|@Nq&}vWyvoH zRBD(!c){%zw>v*B-Q15s4oFk#(+bW^@y4%RZo6}nf7)U(`=%MvEJ^rL=v>}m-z7C1 z-DxEH`Yu$l)dj4Cx43rWtQ1&UZK#BB_xlFT>)&R~+pEko~%25l1i1a@@Td8L?c z`ARDmd|+;{;3G}w+P}b~p#pvfGy`pwSB&EFUwcd|XQ`frssuW_E_)DV)9dN$W!|5} zt|hb1BRzwdiBEmoM&q}t!RBW(qiZ^2%QQ%@2jJ`%V;(ycZQajVg{vY|2}dPtFPFD3 zmbV>Zc$s90-1c=GTQ>LP2VHBQbzbbx@+p6R5hY`sw#`~&=QTT69KT64ro*$}R#dR$ z%31|^;gJp`pGWRL3|Z8a*0NR!5%|5{s&Kn%n-(~K{N204#6m_hNB!+V zc*~P)gHv+|2pG&|iXE}vR9NUh_cGq5?$+PxzN-;>nkVtyc2e)}EH~DUPklHyzq9*~ z?)V|vk3GCJ_Wo77;mTs1S6uxVE3~4whvRF_$@7l$zJxWRf~KsVT%OnEJ=*?odj@^? z;gL0nrT&_&OO`)Bn`5#)H1tbOHIibopbl8~i1FUfv-s{EQ%g7g)~}#k%HYd%a?lfn zztM95uh_%O5{tX*Up*ONp)*7I;C_B?tWt{05w_z8m+7fwwqrf6r85IJ+695an<3S}_7d8~yq8rItcJ)zDK4 z^B$y_|2kdkbHxn#BoQ<0ZA_2Gw#ZX!HKaN)gs&poAfpvq;yZO&xB#?sB8y%PV)F&6y9GABZOh#ww^2qy zsc-Du*gK-2D69UQXwJFstr*v*OdXr|Sj6oAGXXX7*G^OZmx5YGAGD`(?>8-YC|1zg z?-jGhKEV9rBbWuT6xt>pEn4`?bMF6*Qk}pD;&pJyqfCTKFQ2BL?YhYRK~)m+(iW$7!K!-U(<+0l#x^mHzgWgNnqO>zzPZ>rkBHNB(YWoL!`*W?l34{G^^~ks&IKJ#HEkRy{F0SW0<7@cNA;bV||5P zb7HN=Jp^5mPhgQr3LiI zc$Bu&ID742!~6YMeKH=q_Ob1jyx9>FT!9}bD_`TB%;UF5c6@BI$sQ7O*O^|(#n9~f zx7ThCK_Cb0Bw0PNVbFa%6|n!Vm6xN`*SKU8?xiTNd^3x{?>kl&CK+z8?T*uqDihe6ZpSgfQ_laR|SPH zHx`SEO$zoQrmmn2v{i-7pUsv?-}xFk)O9isH;gKFP*lXIGE2p~^afe+ajn?JqvyrI z6+_63yiJQskIQ)-Z4LHV;*yI~WWSCP(!nGte z3_<;NhDRAr?lv1yQnJ^~=LzSs2iJ|W4^OGRRxG=z-pa3#C zl;Va*1#yT#eYkq5m`D1BLhvj|wV&@JKO3F}3JRiuTpABs>8k_xyNv>p<+6T>^kW}l zT{D&Yb?Snr@`O_Fp2so4sm!-|O5{!}Q&M~@v2;OSb1 z`DMX0h5+$zvExC)qEHjY*{&wDYQ+5^DLOapP%544Vwy7MHl*?$cWs7sQ`Y9AZ^Tn- z)Zr2G5eubYB#Q3Epj2UhvhW~JA6U|AzA6K$Ku9NPz`mw;cqc_HjfRo22y}nP4e!2c zsbSATi%T-Hcrv>p38X>xm-7+UH|}q>#A@PY)*16*^7Zyns%Z;#L+BXJx`Zyc5o7Mz z&&2XLrw;)v?E;AOxRYEp7;LMQ!3N%LS(#b=-R*LchXs0ARv@iL3xjIuZBK)@6)$vt zi}%>yMOl~sX0+KT12#y?SVmBRv440DNa6ZH57Yw7%F~t)9vpF&H;bm)=nob>NshnnPTC)N zD|INmzmSJ0ExKRu+l3nQ>|E#b-r>1>zs1++%_ojR^0s;^^nJEfOg!pC7 zDiK2QQBR{5sZoJ(7`D3$&3>u{NNrV!Gkxxt3JfE-URK$a??2&gx&(YOg$9`-( zVSNoL2mpB?AQ!6$n6D*DpT(xNUHJe<`s>k%arCY8snLU`vpcuYUe&(uENZTK0GoZk zav{RRS^s7fX@~@9>%zHfxf3J<^Vq1dLmMdg=86WjM! zAgWg(mQutf^G^YSkVx12sJU*QgilrrPKn7J7t_; zREA4gdpmDnA!^*$S)TkC297hJ9y=YM{cXJEHZsjyk~msE$$J5mRmk4Ym~8ir54#WA zl?y*mz0aZrknE>UIx{5(rEoHl%=-h?I@*A3=3roP{H_k7MM+V9G$psqxA`?+A#8Db zlua3{##Los$I1XRzjQdi5x6C?-jWEbp(i_35n4#{T%E=Ay!XZoUWKf#`h_UY2@dnM z+QZ4wR^6GFz2VD)Ra$)XtOo4p;Ic5i%1@Jez8Yv`OOCo0!Jy$VtdC7Dk2uVNK^WNl zTCo}T8br_}s!U@hs<7l+jWfQtF08B@8ej*75TN6umnAB&A-xFR1^fOXt7iTtI^5#v z1ub}rl0cu#F=ezfbMdAPAuIC^agk^UjGg+XC%)S&a}a$4Bh$(XC=TUntlH3Ml-leo zCB}8X&Xlp$vl}&|P)b>vSRjZpO=d2&^fyP&UPPpS{7~Lm@OA+F!a=njS}=bxS+ND# zia0xq6={=7?ZhFkp%X!S8<}M)f?Q{lXFl_x+rTT0Fu^e4)6&*Pd9X7~pLq~}GP@cz z<)vp;J7!jq%rC-%j*3dP1f<5MoF+@q$r$f6nr;G#WxkSy^Z8PqGQPmOV74KeSf=>F zOoy7Ld}Uji4{ykI&E*zj01FSzvoO%7#D$&0Jh$PgcB7r5zGqZ?N_hZVP#~A?YrK!! zA7Xac?ENV*jcAOqfDzQRk2ssMg%2POJPXGP&sz8|rl;0y=PsoeJL>Njfz;rjVdvAD z@4BV`s^a-T0u1bv%S^K?;W~!&iv^G(qJ@`M(b4UBF1Xj+Q4|eCr4q(aO!Knd8O}CV z)9JwMk>D}?E4sV`7O*AFhecqR+k{c0$Xg4saSiB?qo?Q`ishRgWgsg(i1)jlZRRhx z0dOxPrwle;MY2NsUJU~)F>!6L>-$1LR9jqh_;1lK+;&w4L8ymai z{U4ZJ&*Fu?kZmhbg?xLT*OWC*lozoq;Kxc`@r>`>>D*5=3qVTjs&#_Zo-YS}b47pl zVu^Y2gb}WKj;xSCPCO-qzcV6)C7Plh>Uxbed+bMM3Awrj{T2e(XxTES>T+4*XlrlO z=i0b}R78nn-Uc&E62IgjNAOseonYU3E6{fQpaN6#ckAD;Q35sCa;WHlwcv#aGGKcq zXsMa6)kAI(@4@atHRwJuD1T3$>#_O&g_3pllG-Fz z7O$*U9v<(m+L|lRZs4#*Tybi|c+G2xtl#R6c_Bym1)M*xkggKJQXOKv{$_$MjI#)v z`Q@6k0TE>R<_hBCaE_|_*}r8H&OWmDD=6Qt&kC2szj*O?e|}Q)kF&No8z37M78ERG z+3UZz3b#oMt%f0FTbf&dh9u8s!Q1wJ-f*npeg(qt_iAfZ#p^*Jr31w^+K|az=nedR z0G=&0KEL|^$vZ^qz?c4`7Y`a1&#?m~VhhKbW6;jBr;40N=6RKg1uool1P_yd!W@;{ z9D$K8mcw32!ZZ=aU;f4efDXNU)7)oQ&sr^$`12ibo!Z=YCp126sO&B*T>uTWVC@#b zc#Nmy6?1APDBAkuZmO;1Fx*?jAUzNxX-X!5@YD(1%h<%n(M=~oU_x~;2FO|PMcHata%;*Q|n`l7+450Cr$g|*mJU&-WD zZ@lTtxs39~+l!)U!XaB(7;A;Cpc%Vb(;LypSxa{pEOXfS4fTEc@Cu^#kcKINn~RYv z2Ju!75DE^^!Jrzp;Tn7Luq#2<-t^ zg2mHm6D~JE;PHqqnqj?-s!+CBCtJN@E|DXh1#>$W?)XSH;KU*vijk32^cE!o_(1wnJzt*R>u(|)EiXJ0>a~U%?$iFgdng=I5Z? z);SNmmpSHAZBCb$$O_ud-kS&@-Q`)!G05+EmzX0zKY&ilivlVS?0j-%ARC{&cpv2v z8Qcu=&%~&O&ljckd`UWik<+c-*6#xnQVO0+^p1O1xnBL=>EOkykWYX7I^1Hc1Gs|Os5ozF-Fs5!^9PYmm z<|jrn<8^XHg?Hn-z*~&}suWHJVBVcm1UQ@go?L~dWuUIw9Dh@?4{8oLpHyGLFb25G z16KA&(^kI8=3}afJN|2pZ4DJ0_(R6R;zFV^Js__B`QUTk<6SzR7F$0|-SG>B>oa#e zZZ`QAKXP$yMNklJeHH&;?U+<% ziwFuY24#2*ZXaH6U1gni>4&Z`z{=3MeO7!`($?`;`%wG5^1=hz$`O!b&$MW;9`u5f z4fpM-0b%E|m>-n@pR94j@}XgCNQU3CTRND`&GFg2$xhdB3TID$bCA*YhRehSMH`~L z5&9jf3l=az2bsWAy_&a3h-c&~5>0!!aQn*HxJWt5ODaTP4$ECUsg+a-Dc&zMG?X~_ z#S~*q?$q80H!E=;)!m4SQ8nCMcH1RZ+M zAzzU=Jl)HMJITxLC^S7&P!BWwvN^-vI2&e@3NEnJe?`PlycV$-s!bD|HSQMFbw6Ik z%`KEOQwmkW0GTTlSH{pdNjg^UVOy!34X&S<@H4{pm!h;Oi+-QbzK~lHTR49xFdX}9 z>;Jb<>W9;=BWwrEFwW$I3M*V3w+5|v}0~rWtJnJfX0XAVO1^b~y&y}>%1Q3zB zpq+w(=$#lu#{pGyJWGBIJLk8sYo;vjVZUG0+_!^{DhrhOZCR*on=rSosPmQ%t5d4% zC&h2vR%rzWOxt)L7&UKzRglzD=E4RfzaPpr&|Mt2>MSuakZ{)Sj>z0Bfd8jb-UP_f z3iEF)?xd4*KF+A^PoMXl&kX9U_^uom|LJZ-O-BO^Y5hSq=T65=a7Hx@^C)Yd^Ua;d zfV)0EvwN-k&QP?7+K8wu6aoZw>w}2D^@hF`+-=;a1_&3on^Q|iH$0;p%YO1n>+^)1 z7;Y;oWw_H`ZkgW&JF^~kSTt)G5%d?Sejum9VSUS?ER>Ygw=ZD+mk86e1#IIFiw}9Ri>yu( z3*Zor7fn~nQceR~OQjDBBVoB>383@{#p6+ z#=Hd&RP^-j^+=z|>l1m@&Xc?WfD_l$)Lb`?p#{?0W<&ecwjYK0gVTk`3fVw-jDQ$| z*WI4^(M9yy+4;DwOQdPLk)*L{@)8x`4)8!kb3g!f!0w}KTYZYWv@sqtxoLJ`xNCBQ97+1T%sF4ypM0KRiaaA zGKql#ggK^N?5d2OifFCIwv>Du+QwWxi_LmQ%EAc>wpiR#1_PXLN^al_*#Jf=kb0^_x50zrG5fEv;aC}1yCEHSy!h5 z&Vo(h`86HJ#39_PY<3;U#)!MDqMgbgc%*HJu-B@5ySNH1-PmboL9pfME+e}pk$eK+ zU@DRG;7L0CQQAc2w)v~fc?gu-Qoer=@rOk;Ds=a28MQXS z$l!rR&l)MZ`{U2ryBkMGH@HwE?Cf0=@GK46qHF&!Nq8x$`F12{$(a*#P;@P*-bmT- zeHR9~R%0Yie>=Hb`%bcNAH{5^0bAXhBqtw1t=PRNFgozIiW`Ii*Ue41c>ZL3h_NzR zQOR7Vf{`YfyFl3nJ}>RnCIaSTx=b=|+)x=#7(p*k-u_kQ47blo#w2buOAP~GYbMYG z_wmvBjU$7Y?&ZH6q{gMMo1vJN0cXaBFn=Rud!9QvjQN&W+L{*zWegvRdTt4MEoi%LRzV%d_SZaGD zE3(~`Y(RH+yP@5uj! z<{YL87o+^u_RNjjTAv}7@FidDm-%0W^Q80h4PdXB!nNA5ZPr(*=YsDA>&9CUsCH4fqG}9jS z_-7w}FZ6!`lK*2So}Tisg4F-erILP^;g?Phn2x7QJ-AcATJU6&S#co!6{UB?5`}3cc>7X)1o7ea35as9KM2fptrm6i2Gbw-~ zbD*x-r3A5D@ujstrs%PW?%K))%@LeI?eRVXHNT)@e^M_r{Rt7!5s>ncjDW8B!(q`= zDS1`f4MTz%i$@Eht>x3HDt3uBwi((cE~Q>UPU{`KfLIDxg#lD_{|Auf7l@S|6|rHEJ=b^pNk_WWy!&}GalD7Z6gcv4k_r1R(Ud~~O6Dq0N{Aw%tt3gk;{+1&Q;O{e@ zatUFEC)cNf0`%+<)I3Ut=~H1UIQ62-uPT#Md_No}0UZ;=BtBr!L-eX~@m@-pFC_7M zTCs7b2_D~m1{492>?8N(gXPI`{vyyq_9uy3xH{t8Lt0&Jxe z1>C^N*UnstLs6L&*aD%GWRvj&j;dU&jm8%8Q5lpu>BfmIWwKwO75jiCge4(&s+7=t z2wXhnW9VY1l#nE>>nd*m3Is`_5CNF$)6@k%VWPHEGzssmi^e#vx8 z$81M+JolCkaUXl}en6KA-D4LQsNKktgHfJvJHs00m|A6O6@9`vxqxH+1s#P`^a>TE z9tRkKcR4iycT4=hD?aKm((BTj&PTLYL}$@V*<+Z&ZdrbQaO(kf7|JKjG@|~D>bpZ> zf#5;&_+IOXYR-OPo$*6vopt_8ZVi#(IFbrLl&nPpvkrgGsED)LkZ=8Cs^!5W z@P-10EN{Qw`8d38+D~r(lWDT}EDb!My%8}pQz)DvM1_LUxn_`HiC3X)dmF{kvOyv~ zuMM#JVwD%2VMi$0rj!pI`}p>F8<@c(49&d&)tbvGXWkKm@~xfH!M9G{Jpu&WUXkqO zA#zPBt;PX|G%En-UDL*nv0JQWeugmVW%L`vECC~<26mUytcOkcnt^;jsFMdwp;O6n zp|GvER5gBPON<&aO4UKOa94_l(f=ny0u3}r&42xOBw9I^w@-pXIZK`;L8FIhjPzAA z6AMo@U@=x=d@Zj5wBG=S_p7vb`P+e?hcTcJp?syqJwi?gGPSw5y*6j7V?cjP+zXg` zZ_S!r%-0cwc&&kSt?Yl%%Uy>7)8J1)XKjQrccMz8Kya~gCojL?=BrfO@BcoEaXvP{ zL0fM)!!fyJ;q8p@%mpbDppb*ZY|?7#CaA14IXykw=Y#|v0Dt(6<#gVb@vj8`9p{K@ zdQktsz}axf5iVrW%yeiI^7Q4;_rP9Zz=8wg zt=kq=oe;X!COr2G{a{j?a9zt&Jnu+?B_=mC`&d4Ao z5XgY)INjKV`HojP#9Cx8v2R!)4Ok&S)CPpTu zo{fy2E!i2a%G9ctLmJ0^??4%D;9;19?Y5@u48iAW@Pf2i_J6$qPi>-^XXOi+Oy;Rk zQyAuVtNxAcep;G~2o%gs(eUJ3m_spcAZTIZ>t%hvPVHMd(7O%98Z~0888X8-Ns#Kv z{lqz5{)MU+SH$NtEf$6a$g9q@aSeH9j~au*vg7fa|6ERz3)=~MKq7KDf!d!QXVL7- zjx=BWI})h9C9Y$LTTkk^rnT%#E;rfQnu5WP*MEML4JK?r7g+q@Z-SNop}Z zdnmjwW#K*bN2!j}V`x7QHWNd9waKw!YWh}7Tp zE_p2mr9tj{?@6+Fyd=TGpc1%d4}LlVC7*4|wcFLYuC8)w8#81Y;-ElHRs51T(2z=} zw@Q%ugyRc?IMqx&FMXrU?7h%8gh_OcJK}=QD->eF-AUxRFZrG!^x+A`b3i$5US-NSK-Uzb^PH73CwY zOMMZ~wBfc6)l>vFk*2XKZo32sFEKq*KOXvbadllc;5sDd_v^0Cg5S}89y}Nyp;11k z(j8bG>QKjeXJU4NdaXGUR9gCjRXL9G?Da`1C)-%+Ar$(>{yMG63S*%!+O{7?k|@5D(B6+r0B$Bz`)cd@Z)+%U<#MV-2#gql_xXTDI1!^$NfmpQa zrxpQY1iQfw7GSSl=>nP}kUkFsYyc^?1b44@ z<11FYH7uU*SN({r#EaN`D5&zxX1r|OK+83HU_VTLgv^Du(u-G>|rg3hHPg8aNE9W+LP44C5c&R2=L}=Fs!z?u)2} zA~aj&pKQ8~KWVW2K*?uH+*HOh(b-otrvo2J)?AZ|=(z0G)`JJzVjB=ZGuV_tF-}E@M3-dv5i$)=N~>J-kF_ zSNGNmdpiWDyO(_92Ws53%l^7P#kj#1d-P~IdI)w0`cM7#x+an^-APL02$eplZtU6>ZeAceDLI6iIlHzipj5;=9=do6Bx2#7h(N9`sv4z zoaXpDtZJ&Cu2j0C8JAMD@>%0E{k9}yUwQ|m`-%h|g!fI%hnNBtO$LWo(eNS`TTj=s zs|_#Bj1vW^_#hwNM4>3u1qSL*&Cf#F_zGnC7_bcyr4vF1PxV1Mv|)EN_A;!&x5URv zYI!uWOua0gSYOy^=aIacJ7(Y~4#?Yd+^2kTzs0=WS#`g7B?;`=RKv&#N-9`G+>O)Z z;u}g^rzQDO5j`Fc)`D!1?hbbJ5Z6BJBAiCV<=p;qx5$adhIrHddSpi5uVahPpt_7u zhKp5C^{f5{Q;kb+K%* zX?TxMQJoF$7ijr8&aGv9N3#*j->=?iufV&!VBKPE?u+*RJuU`p{H~XX=Z<9p9*Th1n`yDWO+UY_%}fx=lDBZ*`)i|5!M?uN$Z8RPq^VL;SI|gfZr!!O4rC#7 z(Hdtzqn6JS9=rD5hcRe|`{R>=UU`G7J~c3_X8*4B#@C24uAfV;*pDsOR{tu zd*6E1BF>w!L-)_sGT=o$DSAMbP7YboEYDjfBqR*IkiD`OJ$w1%jdToKe;ecb{fhl< zC286Ui6JEmFB6jtMyZk5k-6BWw(buT+CbThT5WxI9A^pF+E!qjpdM|i&*7jLfQ(5P z8t;2bpO~+hykwmy2rw|bUbY=9l*W~@Dk>!^EZ!+*=d3CUaPm9E8ay5zyYy||q}E2w zo75?5vT8UB7*0)>9gIo}t`BDC(?25cyS2MSdDE%4)nA+%B85j6LJtWojO;)O-yL;1!^f-@H{3lw7c8LKu zHl2$gPXlxk8%+8`qvCmoOgJ}kj_>00h-}Mk9%2g&#Uojz3auM9X@2mV8oL0 zK)V$Ai>&mB9JTyDYOSu2rPX;>>Pt`TK*wUox1MjeE6NH~2m_M>N>LtNn?Gqa@l~0@ zg^xJEuLbGwkDD7*@<_Wf)Bh6Qe!#NdpmpZP-}%gghb2xl=4Qw_GRQo7HuLG0eF#=^ z&U-7|QnIC2ru7tOd}XMvWRHZV=KTZxnD!VtM=Iv;nQ{S=7!cyej~_#9-N!6$$DF@q z*?6eW6%XO16!g7`7k$WIY0r^%u!X>Nig1_i4-lXn3bAB|mmSd&5RgYoW{S(os=jmFz z2-fb76H1TB zzfDFup*+M?Z~ev-H+KsXL^aHO)E=1Hi5zL*@}7nFOenm(yRW2V@#jU~JudL-8lqc7 zSTDPHxZ~h#tmSLtl>~~1w&k?_3PXk=AYpwE0%fR!Cp%}g;JhHLv>N4&gKf#ImVQIA z*3sFp_&RH*-uY>Np@6pI16U$!j7UlV;NR+YM@+!XW;HLm90bBq9uF@GbtYJl94`(YZpEU&FqdKx2dCE zKUYWI#jQ$9iC~r&OS6U*XjHf>)g1i0_9?8O@c@lSznC5rG$JTZ`L`dz-+$cC%%1;H zh)+Z@?+8WAfBO-j{o9Y={lEPP+E^n(a(XFaN#Bq}d|*{jt+JaNwSvbF?##IDYKcFj zp(h?6=;13@eT{H~3<=!y^$GUYDM zqz`T7?7KtS(D3xgg!uRg#Q3}<)oXeA$cOETT;N~FC6#y~=lETBjt9CdOo=geg4OLX zT;hC<*VxT7XA0({hl<55w&RG+3q3LJv}l?`-kRSNqI?x;H&l+H9xIM?R(%5;1MC6o z%;BfI$U>$*9E-F*P;{*e(lfq@S09)M5_!$6%^^u?c4~X-nwoK%AiXn0Xi6(8&?o+k za7J~wd0AA+ca)nEb-SSw7B`tcX?FN%?unMz=FcsBsUF_D)FfY?SyNSA=C$c-a5)Do zUR{_V5Hizcv)J}22szx;eCbl^d?Ni&GuXCz;^k$Qnd#F<5EaUjsMN64Ayg)I_8pNa zVr+D}5IRUfS`iNel(48d)^BxnH5)IUUmW>niYSnD@blDX=x<(itL2Kwcal&4&Pw*n zvnvTJYst&YFIz8H@l|DKXSbPfxidWW0H4PtN;v#}R35ec-gI*FWlA$_Sx-$f;nKM< zvFUacS+ZWvP?57oBIX$<;C3y3*M3uRK65+pRMP(Hq*Gpud*BSe8gq3iwngDjg#D2* zmwK7gxwdqUG6y%gkIEa_4^850Eu=3(?2NaV=SPbXRr&h*V~XsXYea6Yu{Rp}=M|Jy zrBvZ55scWbiNzNO zmY1^YTyg#UW)ww)!P)x9zY|X22|?J9)5qb4a|C+}As^OnTuNNjEe|$>328GZ;HELB~DgfBX%Hb)1{XBmnXY+-pzlm=7(#lz)!WcxuzCaqOJNUJOfM? zu2Gg zl#Rs(W*a;T!^q|+(0^ULF5GRfLe`yNK?p1u!ePUo)6!!eGwxtt+r0VP{yYZWV;57v zSeQ~tcfchQtNSkG9_R;frO@au3j>+YzUN1+FYCZCwawmcGBG0JyZxbdhgqEp`RBH- z$R|UNN&Ar=3fck$RnP>b%yG;@PjPB>LZgY>%Kb)Y!mm8r*)DGxK3&(hZ>fBo*A(3s_ufG+++h5)UylpednN4VUK=e^Cuyq;|_%$`DPNrEj z@o^3e2^D^kq`tOol4A!ys*phYUy@doX@yC z>Pi;?F}H5(({dkG(WjXF{I9zshgLk=p8A5`EP4%D)$10+bH+P^73eglftG{=*rNsW z^T}VY`l_4SWLLt>#!BDc>zEVI$$u?1M#s^vgtY4Wjo4IlJN6~~)&}uL*k&p7=6rEW zr9SGqnRZ!{I6*)1*~dhj20D7$gRXQwimpRB2(V&-5q-ik*Jzx+(Yvv`?rxo>y<}!4 z@7e#iyS=UZ{o#&hlw&5h!zWsC?li~(`$>)(q650DmbM#Ska^+T>?!J6+P?^r$WKnS z3;xBGRZR|;p|^gtI`~gW?{Z*Yp_Zs?;hDt*FGLInq@AuE=NJddVr|rk)tbollH{=; zPgCby9S^+F-EJqQT^0n6YFIc69nI;tRo7wrBUfl;&8Uv{dH}=N8C{*cERtm-5R*&y zA*{G~PSv;}tGT+Qd4DP=iIOj@=!k016oPss85=A|s#nvOu}(f%B~s{K(|H?Hi|l?& ze3vl~&K!{m@^Sf~9eyDdBji)hSsNuuK2Mq2V9d(z)!3`cw6OekUamve^>5B}U-&XPDC(|Rq!r$uqSL;~D_`v- zGN0ktm&a?2caJo$DLf=1=L-Rru7$q|Efkzv6-_6kc>X*xMXCs*zJm zjj|}z^tVc-g=8EN7y<#S-hbh&4F9P=X=wis&MbSv&4~WzaI60EN@dq$I{f>C3Dew;Ov`xJpAYzc%V z_E~w{#0a!C{vdvhkV4B>;@&G8ZfPi0Ixv_c%q!pW`omVT@tcx>oVoQw&D+`w@9I>$ zmU7v-0FwZHJ7m^;K;_}!P>Ddjm4K%Vu1uv_@kRGISa>EH^;Q;Wg`Z8>7ni{rtYim| z9i@7B)bB6!#jysPzQmQaI(?R$aTl%&j~h77q-qumM+9sX{ew_cl>{X*x!#q0 z!aB3^Itv^lhi^X_pKeZ*Mbb{GEjV?jm45~oa$VHVC$-DmpTR5aZuLn_D~s@jH6%JQ z%7S7cp$)>gmnWZ);hC7joT$M4a0U&v77Ie5B5G1lbY|zH)VZ5)5>JV5d}zBkxEQvl z`F-GtvTL|Li#j~Si?39#D9qvLh$yjv!;8DF$;xLHk98}pqygzgv*MtK+s1ZY*PHf> z1QjDV*PJBBG0vGdQH-i&IS|Psh{{FTyZy(LfsC9GeRPYjYqxmf%Rqx6eOH@XX$e!9 zQ6_RG7)wqi@g90y{*idav&^fQ1J35NC5QF*(G8A5_n{)NKU7Qv6vV!0XOH(#7fg<5i*U>f}*n> zgx(G!5E~QE!d)#ew9OJr3>T+`J1u34R-CXn7N%)~R_E9s>pPdx4-yVXHim;dxhJ)f z;=S&fv&60aWXk(q(|rYxmkNm96#GFob;b%xho7q{$OYW>D_eTk+#0vGQHaNO{`Z2R z^P5*75tr|9d0^$^5j2@i)9-|hKl~E=u^SJuOZ6(3I-_gH8LpGH3=jY8+NP5e@fA5P z@>kQ?fE@VNEcn(Yi%@wk$8q=2*!?fDT=pb3PQr^4(MXyz% zPvob*W^%|?baGC|j-uOzJBz@CR2Hq$5{HgPlt1K}Dw0L$^Ce4RZ6|{#Fk7wgo;0vJ zb-X}$#=Y^QHt!T3##giNqADbb_cbOc6Xkd|u6V3j-}=K}m_-X3bUowP@^-;gB1;j8 z=9wjfK|8yb+d{6BWClTfX89O8~qZkWQ2WSU2##}w0z317bq`@v zZ|y0j@qNQkRm=Ih!7OdcQ+pqsv;;L!gu+Hg9i0K^QY|H$;mSW9&LNQ7sPIMI+;1_= zWW#6G<1!HRXk)XlLxW~GyZ&%?<#O)b7K4gjy%IhDY|*zG{iLf>;W|P;!gWX;)7*cS zd`4rgwu+sfXXaqOJ1%6)-e(|LiAwAjMyoT0ZjQ%Gko$kB7X1K!q?6?)s*ly`Z1P>f z{I`PQRQxg|TDw)dXj9zql!aD{G-06n1;!+*sd!w+dVBXx;R{X8r_f14aA(=}LKqcn zx-yc8d-ePX%y>)9+e)fV%d;*i+oG-UiC>S~MBwe&bkJX1BpBL>nMTOlP9FATWZl+G zu`g(zQsP6KI5>RKm4ESvqg}I2JeBrW>%G^xp88>61h!V z(L97=N$B4g;SdxtV^MuVbj<8r0g32`s0^fzdq_a3zpW=Ymn`C8drNTBX+svOqsMTB z#VOVQ8S=UCUrIZVf`kI#mSZ=8gNxU-nK zQscZzn&JTC#J%bI&dtla!hXUphM+I)o8kLPQ&?cDloT2ov^E~${KD_$;3ZD^?}=aO z!BID*S%A~(Q0gQLn5)eb4HEbWdT*h&6@8nsNp>~T(n5b|i5KUl>^8qcfv+aFJ8LEL zMSD~2wdUB@7`4RTM_1!=@r1s#i9BirnK=Vrmxa9^ho*)xhY=KDkJ}fAp2&9o1e)SE zVFOAL!v0hY6+OLak8(~DY#Cfxh=!Q1rGgb%_kZE#E%hN*yb@LtLvo`E@W^3)^n34G zJy5|V3jPt*WoKuPOpioNjK%-M%um7-b*LoBOK+Ur{(Q&=FjXt0aQVgl_J!Eq(fto? zzcJ(i`G_w;j`vZ@4B31mUN&TKxwEy`Uovy(FuXnR#)$pOanW#ichjpT_dH>+n6qZc zDA(D;ydR5QTVmJV-VT<`*bY@1+5Rk$qAwLs_Fwt`)xBPu>73p1!LPkuH@HtnZr%)5 zlR*}X7gsvJb2~uf=m{X`W~kuv%=tEh-`;7}Re`09S`(v>@==-~rC93gY?uE1sghTt z(td_b1qDD9Xg&=&#cqEyH=5#6xLZ?Che1bt<3-cRH*=td1?jJLzcx##=@2ruxm_A|2vS6cO0hUQCXmGe^F$%~}a!F4s}sX={+g zkkqKuUE#^>%eRAtXcK51E~cluvjv&K0wE}s&A$sSOQzhLuU|*Q*{a1Py!}shx^{1O zcSUEsjwV&-^^8xqW}~($tE!Jv8gsOs6kv0Q;-pgEd$jZUg8Bf13UeTRkz7u}q)73rM zg3`gGwFgBw5V@&*xZO(s2O-nxYOyTncOlCmj<0U8`kJ02<>&DhX=@<2harRSORKsd z62!Fa3boaf=iE!K(I?R7w*2sWL=Nc=WY=VI8lvSZwI@|_Yk~ni!f;apJ;6~ z#V+-~ptT+QnBD*M0{l0~ZH-dH@?YfU3Fv&tUm_p%e7hyMGqWYO256- z2p?~jIMNI$Y%+2@r-O#nmmpPZvaRHoDuTEj#_Wsh-eFr0PvWe{M?d?NMB2-D4-aj@ z%E22ag)Fh@y;pBUT38aZ`k_t4An4WtBJY?*fxG_B_nJ0PQq+ zHaa>

w#)x`@=12~?8;q6)E{*Nd%Op%T0SJDc5W0v3PnZz(Ruj&Nn)PJZG#I&;5 z>Bc>!9^4Vqc)L&kKLevkvVvZ0#4#n^iq<1jRu@5+l|ecI%_q9?Ro=&&jREy8t9?tq z>mz!SW0qSa(i#&j2o5Dyz+=dFUOyJM*RRZc<1QOGS~fbKyx#cD=uWgFP9NUtRZzvJ zH>mU7Qg22jAxZEwF_iR^iA;?IAQxyDO2{x-)o{&uvh-X0mfi6xKC(N%z;9>uZ2VZA z&Mr)Di30>aWQi_zjiQ{hr9Tg>H`^abAVBbFPX!^+op1NGe|$tERo#t6IUN7M{kRzw zyu<;A0M;i{Wqg zy0080&CQAaluNOqxx}bRnVp42O|#0|u4>;aXEh@)FYk@C>Xp5Le%A5vsoSlG$M%QB zfYjS?&Sp9K$HAs4=cCodtiPnB(aiyUI*L>9#PF6DI8T z2QbXua<bVi=kr?R@h(K37OQExuT&MmwINyCSEarA-0Sn($ z->g*%Ze3SecOz5<{O&wuIjXAP9j6(|I|uz0SNN+RkKb1MZz#V2OhOWjuWMaq`)v`w zrpU$TKV_|kW8#{2xiCn#e*kvt$UNovu|oGd6Y0NOx0iedJ%uX=5k-_Wb-E zdEnckGd4okj zaZo46Yq1D61N5k=!?eY8(Y~$C+d*F5k`#NF+j5C}9_Ob@=YU5rufveT6WjLmMVcKY zP=YWW%()IPuP?}&mL-HM`I5YP8*h#Gl>Ore3^SG`Wk+`zAjtG-+^1)rYeL_D<*1xA z5&8veV8Jjy@_&SU!ku3Xz#2X_i^bt4(`HGPo}*`QX8QhwbaAco-e35x%0dL}Bm=zv9); zU&CXftv1dSF#=0=Ih+$`W$TlZlSGWRdi?Gmcd0Q1J^Hf6?>@MoZu@$h2e)?TQTDf4I*n!lk@oLVwYnSJMHA@|SbPkh6)4^4pRqihU=Oz0#9u zb^bte*{Ic>W+q!3V0|DOOf*lAKq0xduP0!p`RfD;`~;igPGO-ch5X$(r5>jqBQ>v( z4JPEaSsxYYl;x&7af@XJzU^K&@(;SpoMaw+pvRQ!I#dM1`~&nhMV*n&Cl9-|6$7qx z8*FM&=kn~51SfFubMR?XB_08KCTfB3Ivpn%VJF584JqxZq)_N5rY-jUwcvI%JSSkO z$hzHn0~jn2;ZR$|R0vCw%6?{w{50_B1GwB}w##I~r<}MI7&_QFD+eTu43?ph5ci$A zxHDdw_@kqfqh=)Qn&N1YUjdP%wzc;8sa4c&#W%1d(%t%XY#oOg3eK;DTHjRpLt;?z z@gMli?f&s@VnuEXC4jTFl91oLISao%M1!cN_iO$u7g7*YcPdPoTVkzwwS9d^6SPtv zc{*@JAm+ubOIUIsvG6%9Y^cI&)Kw9Xa+4Tk$Mc4J`diB>xeV$zAy-RO`XKPvm4Zi)G*4kZON0%>(-(QyYqo|g!?onBzfNB314R_^-D?#y@EsHj?;GE+6ZsVHF~-r%_0Xi@-_V8e zZgi_vn!WBo39jY1<_ZK*-PSfW15p1NzTxO(U{0z1_cCcy`*NCk({cSA6zq$H7W96q z$#SYuKMssQRj!7bUzY*E7)CIAC%67T9N?e6@Bf?5s-M=zwt$ycpr@g+A_#QUggy7* zyZ-V@{W}>ph6ujWcoMO_S_%&1I+xW1V}Iao7TbK!i3Da*wQup7T!nK6FnR*q8USho zQRe-xSNq0KjpYm^xiu_@Jhdt_A2?XuARSxcKm`_>1Ta58>1RwFcPOO%)V%&3=B!ZA zk@80(n?W7&l*aK|!8j}6ywl48=|l-()h@aJ_ZVRe?Xq~46Ah|K49P65fBz+mb z%1N-^Dg=?^G3YUYGVV<@ZAlU8$*N|9-#$qF)p@e}lN} zU8h}LTt4WU=_4_5lKz)G4+q+nj#6~$T&e)GJXvELpi5X#ZXcctje}}xwvbSwx6%`N zA|9rFrNkv2a7GDbra}kT&W>El+yoEIBA?|fNp~bH)3N0yDOXXB#{;Sw!oAis3^*)E z#IV^#eYB24jzX7C4&wupTtx_Mc{+6c10Az)sATWpGG#!yrUaUe9ys!KG&izHSjCxA}S zWB)k8xTv}12|@EsI;UXGf(ztDtX6>zWg4#=9y#mDLH<{mtF-D+_h)gkX}62(QCyF; z89u;RJu?BcF76OLx}d@rlusMa!T;>oDA=Kp(SJShO3u@k!s5Ey2jKC|(^R3dB z6&vzEPlluqP{|I)-2=|FQF-H?;2hR4M725>&Sd;D7g|`}x^u`O@7;9M{S6Mb%#o8G z7re&WaBy66usI$LAs#{)>;HKI*;lBnE$uSI4Q&G?Dh5ZRTG>q%w@+V(HUm9HK~Ups z^g!P3BUnX)hZ9(5h^hh6{Bls?-nt0^6t)cZ1AyQ{`uU%}YZ$E(csR2PdF;{ua#lXx zX;C_$ubQ&tr`uD2cM|U>U-*GQ`%Z_bZD2JzF)!UY0UGLz=sU7+oW93QOX@;Lidq}K z&=XYO)%}f{ouBkcTHRKcVl0aVnBpXu&2~3nDEr)gAg}FTbQywuVsaZHxr7O%&071m zp!i>IiyB3DE-Z%A8mBodYkiOQyGR_Rd~O_S>9A;7(ow)jzy?G5g)YmmFt=* zWWj~sv>?HAWB+MmQUPg}#AJ3?1IbhGu&237=sg9yc81ziY+6@TBAd^5ZNzL6a zY&iq=gZ_EHg$s68OS9(Hu%CltHC-3WI$0S-*vUVmGRXj)s<7*_J6*QFxCzCu4H3?I zoE5lS8)d2BRIt^c^<#!$YOju=G+G0mSeKkV4>PLM$hj`9xaG-rg{|NB?UBxu zLr_?Rg4w_ezPlH`87~dZx(`vBMsa=G+r=1Mz>K?o@Jq)<)TTbF3pQ>!xJM;;dWh1c z(NxPQF66sCnt}N_n7RLclwr~W$7F3=OSxrFuxVJ3G&!BQ1_wamux!4*n z)DGAm9(AH@UloMrNSHB7Koy9Y6Ho_G-b#lncUGFUOa>|I8LXowS8i4?)F>)UooKsT zR8UK{b57&AQJF=QX~Ip*c28&kLkb@T+`bNqsuxeLJ-`lS*DsW-=_S^3w!Rw}O-$W) zs-5{U7}HzE6Nu8w{Ft9@i0|`n?fm^p+aw0_hz72f@~1NGW(t}bni)x88xc0Qe%i!U zjiI62)u2sP7BhTT`d&fKQ@iK|%_opVGu)JoP7;F!RtHiB0}PcXU9}xgKHvNM-IV_- zvuP`mLzP|qiS#~G=4TKQqMsH16$yO6+DdYH5YX&v|F!T9CM z_Amoofg%EdbBgmGRZS~IiecX2v!m0;jy z`?nB7IfKc+Dxd3x9J>Jrq()(h+PeWcnqK9|;2hKt zVZ2@iEzvOd^qeQGVN$?w_kbDF{~eAG(E^=bn7Tf8d^~=43{jHBvoVUSgVz(clA6nU z@E-7b)Y4T9kVKfLli{?y!T5D7Lrl*^B|XaP7^=-Wq4D|k-H~)J;#Ij&f7~m`yjL4t z3#bFlJG@ZnT561dhcJiTOJG%4{6T6CDu{#Ywh}NP6q};--o9LTqr1sb7MOQ!OPI0y zSrZp+MNyr0IoAi6U3~^mytIh3IC)G7N5lBCbuxg_jpn1}6dF{a8~QMl#+geTSaoi# zhKOatxpG(vGMV7aRiK_i?zwJM8#esXI)b}1Yci~O5>r{Z#e8&7SMeTbhR1`aPN=!h zG|&zf;(reaM~6aKpO!{T6U$1gdM4SGxGT~>rvHROLYl>OcShTDbf~HDccB5eH9Mv` zh$6q@eYhTLNg6%>91c{8@+x1dB#`B}3}^nc=gh*td(Ql4&eP8Y{J+bBhsTBn@9%P= zI#Q1ofh ztMrZD;N$oKloK8n_SUf5l3rX9oCEydYx>6rEV|f-su~&=Nox^)tBRPCzD!0pO$Pu6 zPm}FT?wi*o^NNp7p1sZLS&#S%EKWd)1-RKl7grn~AYtnog7eVyNISdA=9^}u(=^Dj z4BSrbtPU&K>|VSL;w=KE4KM(-P z%z%iCi3@NMXuzAOivKNg80T30*!zoZKouni?)7@cnTn|R6N#hrkb^Y~nLf&vKagMJ zv*U<)1o%5Xi}r1~Dr!bi822sUTCxFKS1iGKhn?7tO#mnbh>wHi?ho0e1$OI(br$3v z9>&RyZK;?gs-XKyA{!@{$+*EQoLd-)fpKlhmN%7#Dncwd1= z7^%NG7y(wp#%FVlOuOjGfv3~Q!U*rP`cGWx|F>qyf4WY%L z?OG4suNygZS4M0Z0wXXaST^_$Uz8%SOc1+eA=4&?90N_3>BKU60>sCL;U!+esK5&>k?Gqo*TH;Oi(*tG36XZ>npTFWSJ#6^a;ACU&IsfX1M}SKhKQ=Z*v>YtGCl#{>acyNtXRO`i zDCKU~toO2~cROnRzdBg;4IE|AyV?@EkN8tnq%fs-huczk!4!891tqnV$VCoof@O}7 z`?a;GhmZ~>OKFb7ggLFOP3$eoZ2|F<4ll>+4F=7mC%)bq3lKpNv)>Qdl)ZS zN!$`<*Nj16PL;#;%qNM+Z7hgQo}v*{zIa;bXoU9l^+_d50kg|&ZvU6<+M(2xdyk-9 zK{1VqAWD9YjC}s{Z_kgK4&Y0_UKw9DBfBRP)MD4>b_2?!CAh1aZ#6Rf33g7 zh}jAXWMtPC!bKgV;xo#WyIK)m9xSEH=Ds&ldUUR9g)+6aNh z8jXn*ROD6!@(i&RA9PU&Wd)2S36I)__|V$#PC3Pwjv9!qYd~jE%+?RdDSZ;(rD0XB zy&onI8LGo3g?Q9i8ec0ta^ZwBU~}au;5cBve{q!um5A<-en#43uxqvMI4>owN@5P0 z#)KNP8fb{BX7CVVcfD*@HO0ymOcFDEi=x?sA+r9eHXH4D={@{SdR6T+cWmOQtpy$@ zQpf@%a9MEbyrJ>s`@XU5VrfucimayGW!ubqs2d+K465R2o+I2aqEHzRN8N=W7*PW* zWaWvz`ow)-ikQNf#)>MR#oIkg`sCg_99wZ{Y|=S0NT`Aq@WU%%=J$JV=eCGL1xG#Z zc0-OA&EAjqrm;#I8akYFm4m*Xw-BG_%7IsTpMkrJWX6v3+)%ItipV~K={4^|IeeVTZtzc3&*n3n(p(Tg(f)8I2*_w)#=!($FvvL zxw#$y*FFjZvSmg-?(`>1Gg?-XXCV14hsf?s(2 zdq)%CfQ{B`_jZpS(`0%K9`XHre{NLgVhP+`9-+=7OnSPNlf@<0EH8#uxU5-t(&3CN zX^i#WtP1#%+Edh@5_SLP5Z8E(awb=*!B+d?rdwc5RGnoJt5Kc%oH6qw8u)xqm7tW{Z_x7k~e%=|T6i-?ps5@{qkJJUw? zxT_?6M{Q3VRE6Zn+3s*wg$Ft}&`n%1uK#<{R#OoBG_P_Ra?w)$s$nt0TWV;+a&WcY znkezw27h_iInvkFrkyESE#olyySuvTqu!=c ziv=9@jDT_7_hA*7*o*Ki1hz$H?_@k}Ys66cUJ9$?2)l^StF-e|oM9`M>SX4qj-xYV zx1acYkFl&;Y#LtuXHgCML>Vi}ecVASa*QvuQxmE>eF49XH#k(J|(!$6i-f8`oG)yv(Wk0V33; zI;orgVbU31sB(?3=ppE@f1shQfc)A$i>ERvc{wo;uHlYOVOH%@zzYLqMdzBcP`*W6$g`UStwKh<7y$I?sTNrQY1{&n(fjz0M?HX;7An>)7$s_bE! z)fzAc*zSnKxWom|ZcGjiEkF@Q9iw$gojzh7WXQ!kX0ye z!M5Cchg){Xz{D|`Zsuz{cRhrA_WSKkzLm^_=!XQ@Q>H-_g4hGjlu>^!tr1EUix`P@ z(aQ5HLu@F(>3rv60aZnIp4Fx&Nl^ZpQGN^$gOGPZJzvLC4(%DN8{kV!LTMD2o@_uD zPpbTCCe5tnt#lGNY&bTcejlaU?h>YtO?axU-na%+FVIasZbs=I2~{>ecsgLWA&#{5k6Ij`c!%J zd0N-~fvIHG<2>>7J)l&5Jo8vgCsvYG-V(n~Dh>p$r$prlMu;cjp0CfqAbD#WjbUtn z)UMlvl&#wrL8(PU=u#dicepD*=ua8lOIONP1Em6ognX`?#5TYm zBzq%FAo92Z*5IPPde2J-WW>uDSV6b!Gk)JiJiM;5&VbR**UmTot^{`u6m88@UtD-! zo;3duNY3HPDmw9QgaC6Kn{pJRi2rO%4FvD(9++N3ug{BF^Bn&QK^2UNpXM4Xy4Qbt z1_|tAWPu@f&tM^No=E4c^N(vMh-qsFw93ZmFSUts1`2m|v8$h1pyrEgm8JHRxjt4w zD+eq_Yo=kD2F37K<+W-<*Z84o442R+P*6I?#}GMPKYgY$lgPF7V*jGv+x+)rgX3NV zUtNEDayvlxqgPTuSxXcc+^*f5SuKBCWfebYk%n43vh?PRy8W&!VQqSwz^{1s@Z2mQ zA~fibh_52SSUtM-mtQ@Q%Cf7ntz07qR<;I)kBL+SR8Oj#CxuV;b(VL#7Gq4!XEwI> z?B0eL!5pOZNI$_?~Rivu=mLxBoQEZ99lhJ`AkAtOG|6I zde%9wJ&`x!;a%C&rQJ@Q{vf=aToBJye?<)HU<`|@t-gGmbBP?_BRsg#Jn4}Q@OZmD zS_a10INvxVs@ebTi56e79hv|1k8G=O#MX{ym3gz65t5N*)RVSt?d@-0xFlf;S?g`{ZfVDWnIC>|6&4t%qv_3$An7ZxrAM(1qIq~`( z^uR@JZNhLZZR#z9we@Xqc-G_};FvHrE?nopbHtGye%bjW+Le$Gi|F}cu_?0J&V6ja zm}E{8#SLm%n#qJ3KoU)}XFIJ)SR(9nCONp4RDx)r*afZ{P}0j@%nm#_$;LJ%^QwES z`=L@giK%)k0{DZ4ni85#&l*3z17*Wc7d!SJgVF)O-hk2tJu4SPTM3%$GZ`-3ZLh>` zTH}vPQU=_*KQvygE);yXn#)0zjbBUlk2y2zN_toI4l5MP?A7^;RmM5-m~*=!4g0tx zIg~rtH>hk|qHA3uW_7zM4D1Yc`CnKLlmRb&fB$bhHe4iyyGw}pvsWl}&o*_|hDG9a z9oWDihwPVZpbsOscmLWm98$DK63K!(=L&?4 zS4sAtx*V^tq`G)(ENz$mu`=@^UOITmn zOu6>Jdi;1n=B`Ao#Ctgh;S1rWy`5(GA7dYvgB6xb;{aAnfO4Ui}U&|6Re>^$Q`CArIr9P*C%{t=LXEK3At+d zX&&CT9%E}IUWJ%>4Z0_D&CgoRhTBDn456s4I%`Px<4u!{t@nldUL}9tYZJA;-&%ny zNvLrc#k~X%xBSWHFQNLP>P4UMk2?Lry*RS1$LfEm_^}Shoo#>Y85^kOrEG$OT9jzjm@(9IL<#oObj@be>1Xh?D}Iw4liWn z>K+v0+#Oh3(C0gj_v|F>ICgY97F%i^CrCH)`_=<0_qHq&MXVeCjz&h zw@%ofWN2KufHHqBbar16j5|q;`X#Ok5)^ZP^LhIp`m2 zb;f#a(;aGHdhpCE^|TTs)|=c>6R%kk1c7rls>P?VsE7^O&=b=~~>U-{Z>_4tU7_NZDjiL*mbJ|rr$A@XK47Qc!q)Do-&cd z?`-SUo7boNZe<2G4!R6pmstJH|GP>2dtbHaIwppMYp*hcT5i5QfBV$_Bnz2!mzWqB zQnsojo#SD6V0#Eg>yVE~<^{TF}>T}LM`;omXN?B0~6O9NB002xGX>nBmfCz)1A5h@H_ms$`X8<4v zWW+_(Ju{E80_=!2+HP_T6^cG+v}Kfzj;b}5$7tYi9->7!OJG!RVo5Y#zcP3!OerI> zj8_G<*0NinjD+{L?mc)FVMD?2l1Aqpd#U)h%g-10Db(A1fDVZMLUl zxyU;eC?F49bh;kO3-s8J+6rAt)B);vilMQhi5wKeWgFiJHE1Ibbp}Pe-*@_ThQaoq zbA=2d7_+hywV=$sWd6M@e8NgJJB%`S{+&`cFKHy_;S)NDipfY3fV$oBnBf@0ja>WY zW`_tl_sGBAKQY9zin6S>#f)gta>Qf^$wC3B-*+t;oB1S5d}qIL!z_YLUR??E$#bl| z&M(S*=WABrJ8x&#KowHeNvVOHb?7PP zO*?g>Yc@k(fwsI#`5Ej(<#Uz?_fgB(vtO(5{bkDj?+FXtu#$j`Gb^NM1o^7Hb9wpH zP5{f$=`<54MoUqo@BLVY#hpd>QXcyh4tg2t-QHajULS8ybnF2yyl2kz-fVUA{`|Ek zrg(Q(_7gwXN^iP1Rclv?`@13;xcx;Kd>{!N^Vya;p4;lgnfGPTYa|X}qsnL%5lCKF ztTWqvqv)QADQEOo3W-B|)BWq~0Lyx5=#(qoTLa!t-13G6rhk*(e!>0qIz5R}*t1t< z93h)~<|?WDwfLU- z4~Gz*x6(suf|Ht2yC$-;OG*Rje?Q^X1o`3d@R9nq90c_}R#l2Fn;G6%s{D%0b}*cS$ZpReOtDRi|v>7@y?|}*w_1FijzZIZD)~L#pdwA<%eKTII_X!P{+A_ zzMswC>BLOBc5`c<*sr`(b_BgbZ$?_Uw;kD+XvVM-X)KYq&AN|JraAnu` zJTJffm<#yLU^Mi#b})i`BXOCu+(8JRDm1=xg&f^?&s;t&bYtQzTFuGo_kal7Q($@Cd-)Av2S7hF>`#p%?cwDjsgELRrE3m$X0=y|Pg*T#2DJ1o2thM)Wn=~47$(T9KWh{9FHWrxR0?%>B2?xgr zaulZ9`+hmTtP{gHu1IpIm&Dce(0~Zvn%ixRg&xw2KzZcGtbgoDz$U&O-z*F;DEm*q zsQCI1^MPD@E&ShY;LI7IPKBw%$`Jz-7o;I>@06ee;!A(k2G`#wxc!2JQd`o_d@b$2 zK~tc8`JpXi1|>GgdM`;{g2!?c5WepCdKQnLRJG`-| z>s5{UvT=bL8c-#R3eZ|60j%#U;R9O|C#_TkA57MA#ECl8p4UkJroZjgaodTWq)n8! zl=5z3yEymmO_F6?BkbI8!~)X(j=rLqa7jehYljMS+44#c>ECjlFAfh|QSHBPowl<0 z@t3~b*WI?J^lJ9cyKX49&TeE9VKOJ0nbsvWVMZ0KI9JOX{RhSSFQ(}6qRZmlD*5a5 zvmT?hS_i91dpP|u%oZcp>>X{N0b z9K^b)2U66aPuFU-dEFp%`M^$+sW7|3Z6@KXuUn`SID_8^*XUayWRZS>WHfG?(OI$6x}H|TD13PV+vq zxe$J|?m(g->>Ce!W^|M_3@hVN?Lr+5VCAfY6K2YT3ml_}F;E?3)_wkNT{EX^(3n~6 zyY7w(@J{xdt+QAe*tTK5rY_dt3n~W*$kFG-nZ``oo%$R<-uIQ9ogemmI?2Fg{dLWH zw-qgNCj$?7)f-35OJkXRCbXgjfpIN@e}6~#S}U#OyDvejXMOrA@&tWE#>`VX3oVtO zVDfp9kbo-@popDiX;J+AwLY^bBZ(NXGo?t2XD8#0S1Tjoqv305-kbxXItQ;a3KQ5V|I@#J0K57)5 zy39t99{X^fikSXn^YQf_13~oSLqf^LkA<*Dfge*UaTG2`~1*r)xi+bH1HkF{LMb- zAbsN3QpRG7A^JFy;IOU44=bUS?hQsC_ww_8P8-%y?~3-_&KnH=tazC-969nen}$(e zUGjI-6Ygt#{O>f~$c8fD<_KseS=@#R;q0w#r3i7-l?Mb6;AYrmF^BO)dBY(X6?2-%x zfvk!sTN%y~i`65ArAxYPLLTGE;7n6?oTKXJ2qDw27uvy@gUU9cN&~UwKNDd{zns~M z4c`AAH#L=1c=mTO%<+}jX&)YN&bo&_l3lVKj9Nao*Y3ZD0fDXt+8Xh=RpF_A_hU0M;4RoWhZw&z%rODaCAj+K3`5yOlh=>;g4EO1xY`%9k`Y0~ zfjo~ujECQ8Z{X)R8;VE*WfX~lHinN2QY{WbD|2q(i^3QY2$l5f5ID&MHYCItatjPJ zLXlBIJl5cp_w>dH3}(tu6xG51_QWq!2o?IOnI7Ce@hlxvBGZj!0aXXwD-b}jWcmU2 zgA1GM#NM4ZYqa4?FynHYcu=7fPs9NzLe*YlZf

    sqvi~KJ;E}vjY#K!5x48Tp=RsAj)-OUDegidl`WPh)+rs1jM>`uZ~YTGHE{= zU;SKc@JP>!)>sdyWD)Cd|I7DiDuL=~CXwK5!sE9woG87eN_lQc{a3Z+XovGA%i*D* zZPo3UQo(f&`1WM*l!WH!pZ9h3O@+`6XT)+ZNJM7;>}ISwG(Tt^|CFOJdqQkbEO9xV z$(@H;R5K9rf7rXY%Tz3xhaCx7+pnrWNLR8I0D;A}?~rv@9GaJp9C&_$F{QV#?>aa! zZ~!~dk$k{Qu^!m}(J4S3T!EBEWjsP5!3!>}z@N71*}v_7F5}DiHH_hGC5Rc!4!Z|^ z`CRN(5_1NJhzfF~FsA`PVP5i?bLmta{>#sWpY)%%z$9KG#9K)(I~MecZ|vvSyq z2c@{#ydCg>@Cl68WB1k*_n|@4wkoM70ZRMS6^}M5DawKX;>Lm3D`Y90a!nBaO$m|9 zlXD}&?gYd3L^eqwve=FniOpl@?mXv`=9d>L%gM+$$U8@DMm=1Dzod7YZC@bP-YrUa z&?D$*Xu}ofxZ>wn{e_*GosjaKrQ?QD9aT44`5vtASSkFpXvl#8+@~kkQj?MpoHZO- zS6N$$%}KpapS=l3>&NYCFmN};OeO_dmnRS6%h(DQo?|L7Kd*SSGcq#jVKvMMs0ekc)LFbXRv}&p|(Rrf%)w+aKg5GBhI^&tQ!Fbq$v7!HC0#jS!ce+<=K?&CP z2%p4altn#pWb~pKI$hjUttUsR6E(&q`fu`It0tt~;J72lAZ!C&#Gi`gv*{4=n|bXQ z!Q_if&tAqF8trR`vikDB<$j(G#qG83-97VH!@T_rI>&a(0xJ9$XDLvU#@P`0J#A{N z9o073!5!GPeo%F;4iSb$SNfe?v@3%Vp?vJICHjEQ8$X=cVnMpMXTG=?J0(d%!?3yTyHme z2+2&)hK;v~u>|W|Y05(L=`}Sq;{xoje1@I{k5@Mh^4f5Ir|s~fb30S#ThFyB(L2`tIijG#lYb04QV__jp{+<(h#S2?Ee)?7!;tll6>IiPT@o|m_lcHfuLhu zgBtrkF5Z8@l>EpfJYUvC450|l;E>ku)Y{PoRakka?;TsY2Q??9)+nROi{KQ7F|XX` zej`QcI`e0lKz$*f^C|C|)J}SA5u9&3DB4T3BYKVvbeAWW(fC`KRd^zrJoEL~hpxP4 zyQWueS0IMLt|WzG>pVkbNdOn|5`TZjf^R5g-({L~HtMEj0#bg^D_FU+fX z2zJGrH4!L;^GxYLVE8Xg!24cwGuf#*C7pMpwnjzF({ZGY5S*!^86+4XhD^7OC8Pfz6+mB@O0Yx)ZqDmbA{ z>C0)KGEnO7brf;$FQrNdFlmcYUw|pPc?|e@D{i)aCJ3;8e-CbTs+`!GTM#o3qrdzs zTN_0BQmKN&No2bhI&`#kyf`_B5B#05q-u|>hiyrmU?6vLwib7dWfY4I6h;)D_Bf55 z=xLj(;C#!mHypI496qq(fqTUjz4d2hRYfO*;M%umWRV(R?Suq2XxR9cC31uxNxSn& zPtYch6vEP(+u74?H$9_tEt68KWcfsPj#2~3n}K;BQf^rI1`Y|3E3fAWr(B#G*Y{>I z5tM?5PTV9>C$Bh3vY$-a7IaDC_WMP*tZ9@a5p?vJhTzME%3j}@M`Tu0cLi79rDvQn zZpO{?1%{lKn=qblX8g=k{vC?~gc_pG^6U3$oyPhQ@nL(Mhu(PdM~PE*GU|O96o}pI zGf@@c@4lpd88!Uv#RHYXe7GW}2_unCGPsfoljaUb_BWO;Q+|c*kF(dp27#)&7sd)h ziC91+NmN7k6sadW0CYw8MHmTT06n`Q;ntx>=&<@Wn1hzLRue0DB$R5i$%*aj<;pf{ zCt=-(gSNH1Aw@jaI$9lMz{SPobG~?-q$o?cLzBQ5wL9~lg+ET~`%TXn-LK+?w!>T~ zqv)5OzORT^xsUVPf^NMD(#lI5xdOaTetZgV`y`JRKvg0-`U%3Zq0wdp?PJ2(7AV zj_I3k0l@aAID*N4KfwZd6xZK`1U*nyR&6F%Qie8_JJuX-L16Pv=mi1;Y9Bj_6gYhF z+l4t4+K&wOr4?UOXpJ?46y1Ot_89VJ!fMyKsAk zl;a=;<4z;E!kJMVb4)0Fj@nly|B(db>~VNKvk6*@Fomu# ziDs>mCxR)*cL6UmH*<*p29V7{W>$cvsFuUw8b7TiCl~)Ij_Ovz@Mph`e}0JH%-ih8 zjuOtIp+2IkJjf}h?fT~V+<8M+Lc4zA6R_1D1!|Ge%FS|RFmu7&=VzML2(}2mix3kN zp%1{*Ps^_2x`D3PV)t=#n~tws4Nao7{_R2U=};dC%=bcjlU5yNWqCrOF9~q(UXnMn zU8~zme(BORn=V!$=CmJvy<}T6C5Dz(D0c;=nSd{0mnQbwra0M(&HEq*-ly!i91gJl z#(w*2Bki4@x<)EB!=Sy7 z%>VJUQ{(1UBy!+BSux1tI%d}{oiY0M9%>w&eUt8HrL78gJ(cc@Svf;WkiK1Wrn>4R z=%K-Gln63Q@Qe5F0-n~Ne~&AEh^Q`=LBwfDprl&5qOIt+dgc_T4g|jz4oeLTHGDrW+~f0qIQFs@D9hT{E~>8^DX68` z>wm$Tya*w~Z0ert+Oz^^e2Lx3+4!`e2ks2a|BP9Vt`4`0;g~|p8K2nw4hBy}X(Qb~{g6`a0}_5WF1GedVQ+2BU>ok zCvAc9*HjOd{LPj3s?`FC^jKWfQ;8(cHA zeqt?*NrCK*i=OAl_2RC7R+bqkgdnQTG#y0$v0iI9&Q7 zBtpA;sggEGI0ue|8{dy?D+}v|1$;;n1&y3O;}UXl=}Ug6RWrBqBj?j=J9bT2 zIi?_p&!eFUQPp%E*zXPs6nzCmP)r`e9T)4uBqqkkONGjC*X3h;IVsm@;h<62igtGc zuWo_!feYfh+b>sw9@)F=Ctd;I;K4JeIQPZZql!BfJRT3gt&s|{y_*i(chB&JV4Fs3ge(~{KoyHVXkg)ye-eak;u+ei76Ha>%3 z1u1^M`gy7@b~}5Te|)Tg(oN*BFb(A$bh!Y2xAftNqV+5Jaiw;#E_+WD1OtJ*<=Ibr zmn*X%n->?k6!>js{YoQ(T*A0r8IXIC#i$Tc2Joa%gdKP|GH+?Jk%F(;6^uEW&`Wpg}7!XfC{ds=(&6BI=+xHxQ z_iIjG_CYuZR=L-o?%U!@SG zl6_%jpRN};&DY%X2G_{)Ta+c$8tpX+Y@bJSMl3Rk8Z-Mfli-@xHu3X=r+Wv}*cr>` z)#D#W&SnKfBT*(q{6ki*rtdUdj3fAml>GU;=BtlQTWPzq8d4o;zD-I8p=Bm8S8c^I zEW+cGU;or8Jth^I1NeuCjbkB;c@QKYhS)cCgnuHy$vPtBgCMrCVqUf}3&?NKhda#Lj{lsbX(M@z$@7E7_7(>?X zEk0RTTJs2~w8>FIwOynuAM_Aa5;*0OLLCQ19cZQuOI6O>i@3>!F(zuXY)e1CwZoJ3 z8=_8myK#_l(ACw&*{bjzM>}R$5PLIH1d}F@slXe7L5SOUx|M$jH;%Q$#_f~IeuBbt z5*np5ZNs~Wnp({5Rv8$e3$WctghD||HiSE;kgTtdzfx}T&8ID;nN)y`HDGK)G@rM}~!NG&{Ep+(FTddnJ76udw%0a=rqrd#{UK%x4}&(i&>MyDa<(lX#t zgZa(3Q18fq7gpJ6o%$?~3l9kdz<0$`;ZG;j2s$dVxHX*RwISIaJ`2}4izlmQaGF*c z8{`k~WKYyWV=FOi4rUrB zR=hPEO?fF$W9ep#O7Z5ogvx`=Q?N*zqW2F;Smx~*s!SRb!CsS?o8$C0IX;J!_o&OI zh`mGBpJw38FYg)+oKV}+oh7-J#FX^L^5mokXbmYKj3;ibm$&+3Mn@yfq#Z=F$l{FWqHWayK)D5l?yneU zq)Ci>UqMaj=MjHCe_vDn4Q%c##gpoE`i`zDL1*^fm!1JfR{~pRLvI2OzX#L_c2?Pa zaGv`|WU>|D)r=SKu98;I!(4gcpM?KLx4dyo$KfMD=O=Pn+jL#q#JGj8{iQ95ddKW` zlH*gEM20CoDLLKF&v}P7na*Y8y}abR&QM1U+RXFOS+A$uI;BsTwMLDDGt?pEuJnbp zvzze|5kjPz$u@h+#{}ay|4DwE7ma-Nu(3e{!VCI9L3H`@zgnt~=*JH(MmNi=|FTct zskAtjIJ&yxfg+}C@?bi>cvc4=80;dvIMG)(XnM_Kt24z3yIeoo7g!^9z|M)!arCQg zgk@F5zzX)4x&oGW7Y+#T?0)|Z$gW=0nLd9=i(%)P{C?B71_l@}FW*FfTi2Db?a;S3 ziv&VOn|J50%;dXH@N|-Dp(1g}uCmWczb?p$j|1s|V>*QVT(a;w zQJ2c%6#wfi;tjG+#vmQhL)=YjiU$PCvo|_;Z+)km)n5d!qDddtGe?Pjb8_j?xmdKX z`#0M2Dr9!Vob5?sMQdA5U;ftP?qcp+Nt&sh*=4}O`rO)JSptcwUfGc`tmhJ;FxdCy zqxjm}`e~2#{fUKe=JnTCq$fuoPfllV0by@xG%^gU=y(78b!KY}ss}!a&w2eK6)A>4 z{uG5<@0FSg)UZ_o$Vp53R(RWQji(k-?tc8?Hu1 zMnjuet*Q?GO-XiZPkBGb4sG5*03XtZi{Szjkm*B@LRraO2eA2yrc7F-LRHtSBD&t*F`U?|!{L?g^1_#HwR{qoXw;w*URmKDeka{!V2@u;0%%B0jh(;Gq3VX`Zt%cwf ze=_D}MA)J=22Imvat#@O`G5T2?_-P2?O#6>Bi%NCPWRg-!h5ItMs@YoT+VKklNRDcs#}M7Hhhsm z{1{X7T?g>ga4G%4g^n~e{OeSl+)4N;~qRsi<`-TOv)t8je=D zAMMxnS&M2_FXc-@|A)p|Rin>WEfcBdlXv&%FA#s#8mVa0tv)PFcvKJV8VYnf{9N%H!-l{*P$*?*M zcU}Dz2S}6G{HqlMXE?SX6uGzf@pAn8?d5%!)%_$!i|lR8 z>6Szapa$MTS4LmHe`0`^mNqctR(qv(R^?gSPx0ZaH>wnv)w#~YO#noJB6!<`YPfja zI%LC+Gl5N%QgXN#c9`jx_yvLUYzGazt~Qaa?SBNu-IQi)yXYq`!cF$-+Z+y{B2)4& z<0>xS7o{ovK|NXByb{Y%|A&viwkEmKOt7jz^t)Grs|KO-q5OD{I!Q4zQ{s8TF{;(nNv5Imb5I(93ClBe;i%_T!s%8xr7z?-_?&bG&(d zHY$M@EQ|sHVr}?O0f1IrNd4W*7bx`8t=V}60Kk9x!`YS^BXFmw<5O!G|Kvre2MX4o zWQL+c8|7qOBL#+BaLPup(I(HJK}=&vgh+%$vvxFu#;4Sk60*1WvA=l?aS*P{XH|)! z)0<@FH>1d2E?(DnRatxhr^tlJ34a4L=?DQJ++<;B=S3eDH%`>Ycryr4q(1K!Le$zl z#t+_rodhQiM--}mI3&+1Pn8p(ohQ8kaN{tFTW0J;D3FKZ#4WrVaiwph&0hcmaLhF4 z4U{s+i1a;44TZop-Gl1FNLrbpFr@m^9Q-C~1#(6{5@8crJ$vS#*N5Aw(dON{nvFY( zJ-G}v#9w36rtEAhHQ_-Hz$)K&K4?K$2k*{{USe6CW%sYK+F?nO!`X(_1sv}7N{U0! z+)PUqL%OkL6|MWiF{fAxjct{`%^o5UbJ~4rW4Ev(dxD*|*3z5hUHo+kzuU)1 zax4#%&_U~JP|Z0h1x_NORifD{4}C0iS|nC#OhSIAEE(BYQR-NyRxQ^kwtoNpkb=C% zo7M31$!0;da!UkKZOv_5&vJ=YRD6XkpUWVtpbHfuEY728eCs&d-!FbsdknVwtqEN} z^?TrIti9zZ)!m02#)RZxJT)CRuNtiS4iFw|f!U`KNSSc?enxG1YBFNyw`g18c8t&!s*m*`0D} z)~$~XPc?~bc2xByA-wL^*W8(kS2Ut%Vpie0MjsX8J&v3VZV%wpfiJ91mK#AvLN%Ma z#GH@5)1cR2mNTfGf%%OSYrbPm}Y}R1I`ZdA>Cq1dBG+hFl&8u67!QBTGW6Ee?-qie_{}5IZ>1+vgyb0 zF8x5?`GNIK7#u~tQJ308B)B8tUd-sYt#=~YT@A5Ek`WE7Nt@{vCtdcvCh8(?7Z ztbOgk#=FY;_jaOh{8EjyKvDf`JUDUqap#GYB(&a`ADlTBG9GGn0<>zuSl(Sf-^Pee zC`l;(s}VqNRT+X1*CYr0mQx`2Tbp>%O4Ill@f1JnW(7>Fr>z|y)qA56!#3ly zxH;*UM{cIlFTjkAeR0I0@JnjZ;oJG`{X}7kC$~%-N;FEwf(ND5HJ^?|s>J>Q@!ek& zmnn-Dy8cK|&JZu-8Ql0@qb{=WWBVg0Ru5m8U0cuV z8Mw8>jGuH&b<#>@EFwtuV_Z8IIiAKngV-v=#^n<(ED0No$+#PTzSBR2A`W>TeKLOT zzV(T_DjXW>ij4K+(QK_$oo)olwd0e)#fDT!2z*Foz{kchbMqKFzPDgSQD0TtcS|*Y zyAi8aw4$P-AO*KHBIqFWz`JOM zj5|p5ZHcHn-#&fmC1gu zD8aX#|L-r>Qt|{2Y`ZUmn_5_Evdh@b1oXIHYIux~Bbq|v+b z))LMg99yHWtUn2(I+v>BHErC!dx>`C+*UQ7BbLX;kL0 z;w!1VL5u#znkEVZe zBu7!Sn3GloJ$vDi4;uw-R8uW5NEO?Py@8o171bgO(yFo0Z_!L!9@ zPkHqgfDBWFn^GMmpZwnA4q1>emjMkZ4A!2!{4{5*>fI8Ycz7)msZCLr-iqnVy0N}P zfT;3)_>n!SLqRh@9Ri?eAIaCOjp(XMeVXloY@(nqKB{Y|o0uI(*Qm=3FNI~Ouh7E< zI+m~`N;h;bt$_>d)*h{%5Egfa83I7Sf-`414KvOC8tmfa`oaAk2t>~A6rc&PJOHWdkzGWIo+p7#x`?&GSz~$W_+ig(v@Yrp_4wK4M34p7BQ{mU94yALsJ# z)CX7h@4KGyRWKeYKdrR8n-1I{&y$O$&Z$3@XLU*#;#=-K7}gI}zQb7KQt9f{ zuizA^D5Q1%qx0wgr$N>7m+I*7ui^1Jc##APV^r<5o$O{G*>Mtn9DPY<1QEjdDsnk! zUk(;aJBox#)c_nq>p<(PD-*K+-1<5PfucVcwJchK4|=hIO}I#49|qSl27*Xh-^$9$ bGxB6BtDf+H|2+7B8XzN~C|)IM9Q?lkm*XPD literal 0 HcmV?d00001 diff --git a/doc/en/texteditor.png b/doc/en/texteditor.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3ad21b958fe8c7fce7330002f30043af406edc GIT binary patch literal 36009 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 zΝA6BEXruEN8VP|y*F5ypZExrPu?LX4*RXSwF_sInfyo(XdRag>=EwX-FJ7nFV3 zro*2?6DxUkxOL-RSkWU5bD}#*4hFM$@!xniMj+)dnA=ezGiAvqB)qhe;QSq$F9ueX zz<~4Lv9XMH$8(0dEOQIZ=H~d3;puN@EzpVerH5&8(~2nQ7^Z-rz(u=0X7cWAwI;xR zcX-j$v-}5cg2Dcn!oQlbqpR(0Pn7rs-P2R&&6}@t3+$VnPbS-<1Y%;zqDsQTBaIe@ zlKg(Yz?xJa7WV9AyMcF^`}nz1I}jSLqP#1i*SgeCLtXvy$c#lm1tub5TLlJzh;{f7 z(VCRAL0Tq3P@}spipoL$LJ2I$*6;u2ZnLX*ex7R*k4BHfh>gu7%1^*(g!<^v`;I=gNn*RrbzH>oqV^6Dy!P#=aRxyE`FQ3pzTt8hM!cpNde2>fwbz^e+ zpr<4`KuOXpw7&n6CjffT+B($NTV59OGO|6Tk@CV2>lmjT)R{cDC6Itby3VOLkn)qL<*zLMLgSm(MLn_{{!DLn^3MwkQ8-DO! zTOe`uZ{NNF%w9kUTm!a$yj--jgxlD_sR2)Q3xGHM>cd719E#f8Nq&6!Y^$oy0h+L1 zWw*liL`HTb*RCfcMABH~9rj|k!PVD!wSG9ax^Oc2alTR2+=9$N_2jX{IC6M=wIhB= z5l=i>Z@SN@^Vz?rzuy=Dn3I!}i3)r960!)qkNT9bR}}c`viT^bg@ojeRnaj9ipf6A zZq)v*V%`1v<8(UYbHp}nyNS2NJs#DDa-jDUWhF(cE4|jMbAGVJ&VGUDlSdozdbEbF zuA%iLc<_4SwUdLCFzG%<^CK6P%K#@6+M)KD`=%n2orR+gHba>TR6P*l{VraJ3X zcklPY6H?6B>9|uRWA&qd)i?g;e#>9~jHKugH4KM-mhPiq0)rN9D4L1aYvVf*8;-4& zjXHg!UmX4dG1MjFBK@~rJijeEQswb%J@x19B1M;u%n#%<5d6+Onk?D1-F7wuWSJKADGiua{wLOanQRI`eXkKqGY70eRPAR5}YwG z$nB_>SN*t6LTAcVrT7x@(ROyveTiu+Ygzo<7ZD~V#Pjkt10W*gysM7=+0hSf=`i=V!0elTnkH**#legQ0vo(uxS>Cd0~~w^lT-^s5xA~)KQe?^73*_ zOiWjso9XY+BPF2T+?eRY}XMNL($q% zi6c^0gvqhwkpvGpar(4JccECA;>Bbhz90STlt~_vQ`nh3{YjGtUW@+-29Q#tsn8{0|w6Wd?TUbFJFLxFw3Kywi75QD6-PL$w?kC z^0RunlVHS^& z9C|LZ?;LjT7b;(BR^jpRWb$ffUMEVY(+jVU_l~l%+3R9LAu0tp_c zOD-+K?uoJNY^|p0Kddb?cJaJP{=at>EUTJ&9!)M9zx9dc*e16^%gf2XwT{l{%gblY z>34~qoG*(KgZ^wZ&{4?`1bRN+DBH__9Zv^YJtIg+tGKx>?nPKKa$}QDLP4Vwws)nH z|5S3c?mp}1(0mVz`S@p>TT6Zz&UXhbp{hdHm02H^F$41ej4YJ)f`QhY zJmDz(dEzYy|DdGI7H~I4E8GnG8i}3|%bEU0+VOhD6uuUzWjUQp>x!5QC#bG5fHf=v zb#yAGb#i49jOFQxs=FYVF*E&lVEBr>ozcbM$q704R-5zPlpuI3xpJaEX;j=?85eUn z=__TfJM~0F0)gcuH5FS`Q(4(*tLGCI7S^}84Nx*N zk!9HwWFDo0^(Voe8=@&yP0gJED7~-7O>&<<2YUW#03o*u$PczTVf@2J(N(0~ay~sZ zht%~qb9VJT-bsLka&%c~1f#=${djFN6m&K<*wWOC?l11@+Q-Eu6%lsyePi=)_x$K$ z!$CoNDxZRJB%G9SVvQ66AGtBdX7KAnO3lSy@42`vT}{<_S*B`TFJx-)D6U!!Qg9i05+b4v8{7C)eOFhM z*6m8$j>V39O`Q9XUk|c zBAeNqSCI649@iHA(5L*LwAk328%}4%TO}VeNz7q|w|=T5cG~wsPUid;baUg#lCP<# z_ySR9wMfs%IsaaGGnJnHKv(5rzk4u5L4hw$3v++Hw`ZoHz}_+^$d~YRbUk2kcbC(9 zq^9<(rE!jpJ$W5oQ&}@^eoh4ktK&uapR$2rVYZAyhm@$8#2K&aAGdcQbu(=<^^n@( z+M`(lELvWE_gWMyy< zoi=x5=TH9>^e7~@;!L|DQG|C zS?S1wRn@zVBg#F9zIFL`;P9+uEP$;Cv~nXV zsxpY6_IBaqSlh?dkx_;`+QDV4ElQ!@yqTGVma}0rG(0Ia_`rWim=!e)BxejBr9VF} zt9>Sl`DaI-IO5#c!nSe6RQAJ9PNTfsks(t(xCpAWy(viwF}z6Ds{4waHMyx4@>;~k zCMuIf>|25+KE6qmSkw01>()EwFWqkfpG5)|A!I~EEPm#iiiqHV@v+)> z#-p3JR!h3DJxdmD#4zDLnewicDA5}5`N72mT%`>hhGVu@MkglczKwlyH4T=&VY-G! zsB-lc{Y^E(q=t1d1wox;=udeSclsI)JMdOfv9-87563Oc$B-%uGg?;k+vR#a4!Ci~0K@E_3D4na6t zH~if46+%W+6DND45c)L~=oyTvCMC1~)+P??`%|pY4R`nS#1;rcR6?CsTp9{X_cV=# zpHO+4=5|pog#~C_k&xncRDP^!bV4jL}DT*FRH9O zU7h6jyY+dfHZXvLfpmY?wlE;aq)g`c?L)GXO0<`jjVP7y^V38{C7rK(S=sug zly~}lz@)w_7U(=3Jr6`oo}V+MFyx?P4*J42HzD5LdXF#v>LHk}nGVPJw7;)BHdZXi zMf|V7N*gCT8%Iy?S8=f~71hZnePzMQ6I#mCR3a1W1!tt@Rt`G) z5V-D-=FkQVI46r`ro}5MNqaik(`$)&Ebs>QhwjA_iQ1}R^Bjb*A^!;?uW$H5+E4K1 zHJL%j8}8VR+sE^RespqiZi5(O?Vqaq-au+DJ%#5%B#!p5uee(A$IAnfRKqwSHHthEjYv+xoOK&dc3lbd1CM%b^SVm7}92L$-dX zXDtDBQex!X++r8W#rD^y7kWHi4fn7sz_FTRd+#5JjOq&6<*unCGh8`-^6$WTP~UHE z;8S}}oEFxu^hjt*epz71I;Q4IKt#a7c{;C3*h}XPo(W)PI{)g{OinIlQd&=>Ow;;6 z`BYL?W@cQFbskiy-M|j_leE^{%I*vchn7m-=jl4XH^7*z;|JFh>(YmakoT`*J7wjd zu6Mf|EPNr_$+Ht_=2o z++|zThGlhiAt%RwLw1xpf1KOA@GPJpg^QCz#K_EP9^2FI;_zBP1788rlU^bpisYVD zEKkIyRZ&)Exhsh{V(4Aukyg{rqG$nIdDhc$8dZ^Kk^;C<(~Q~1&0aEkT_ZtQ;aNYP zF6Uf12w2H&N>-WWmMF-psCO4>^a-D(y5v9@eYO_cOFN{tLQ9va9K9yuO?hYPB|x-N zQo&_Y{rBfqVRA}?Pe)-vL`lK=)~^>tOQ`HHryz;H(-y6!k{FKezNhX`VzIy}s__iB z7raA2nk{M#|3Fa+1CwI`ag_aI4l^n(sFJiRg-IR8Fx5-xvz=$}bOH92Cs4x{7Z>X@ zKfSzYYiiQzZ)EUt*lpOj|C=0NmzKZS7eNz*iOv*C_<%7ppTAjo3gVx@x^|pk)W6K}pK{>Dz(PYUf z9ML$W7MA7s=!sv#xwr;e+n92;Mk1J@R2;rJ$YH@A(9@%7lYxizfQNChv?Kb4V=w8E|OG^t9v*R>gzCPL8!@0B%VQy_- z#Nj_~Y}!Trzj}Mipt_oFQ8y&GySoN=cXtTx5Q4kAySqbR;qLAPcXyZIt_z2=-gocs z-hZcd)xGCXR8iG1d(EEo9MWTqXFPo~Tsq5+j66sh_`7rK0YtP1Lp)_;uqDEBhCpOF z&$-|l^f)j%G0bZg=}TNxvjfvhsQ6uNUj0$yU+oS=TthVvxt4!W0h>-2K{`3U{OF4w zFT1zD$XF*FdLM}U{S0}|G=ILz`}Y^{y8o+G$X#+T7ZpvU0SR>DF9aE76{~NclB}d( zMlbNl#MHU8)Hl5Ab&|M zUFlJLCF4ZNi;R?GqRXW%4|U>48UY>F0&hgWN@#phQTNOr4pV|A=w+K+SqPK#Mpyoe z()$Lfs^kBCbI!JY7Q?N4>deIB;=y1xr3~r=?s#k(zBg(3i7pNpeOH>El8-o~#Iaiu zWvqeTf!BM=-Z43K{7IPXjNflUoIYIFl~J?vKq%ntemH^iMfu0&aHG$wD;^#mgRGX=KIWI1R9+0GsG(j&wEbnRJzT&sbkvV{=yLn2nS4? z18cp#b)@9?>I#`#;m3~;1x3&GMZ;zT+t3Kj^Hbn;3#?N~HTbdI5H>j_rKb(&x$r8g zT1;I0#QCM(WE_+pG!#d4wYS&zlW8cH;MGJ{Q~L69y2TFgJk7f+5ryfYp;}9j*V(Dl zQ!z9olf^lW&7(Rq%Z#dz<(^;R^XmNjw=+mqoE-EX;_LmEa(8ri&x^wR7kN_sSm z6i7vwEs^NBNvEVDtP;5sc^`s-hlcCe*h5fv@-A+{v&r|>NpV7U@8$-@;%a>^L5p=n zpsc39AW{RGrDb_!?3#&jG!^rA`v<=|Lb8XAedNPyF^v53cx;)b0&`S`EQv}2 zpz9;;zZO)o5GybW|6veWJ>AD-B`I*4!2)iRs@I#qo5N;^lE0c;v1V@PVRw+#!4=F| zWas;`4eC`w+JS!&+*0{{5O;hAfuGF<3mZ;mWvqkm+{j<}yu4praFmLKcdP?e602d?Tje_j$o&se0w?Pvv62QzxIE(H0>_ z0uvGG`wjf|1dWxUIyW!ieH;Z8iuN}LMZf=$fI4bBLQZ}FERY|!*Poi5-<}*mg@F@t z@IWvNPmhO7@_>}-Y}U0};i%wI27NX#InZGmYunnU&vl$2>Zl^kk4E>K;1$hijM5QY zaWyrspRk)7${?5_m0(0Kk}zY3+i-h(v7@@SrW^u%W3Y&)XGUHg(ofvexkd{XEv@rX z6^T%?m{6x(qbvCv`kt`8_QgQ16Ge`iH`!_4T$W~lm#|sW72L}h&(YBO`nRB!sFhJGqWNIou1$oPZa;cs(Y}emt z`7hKLf-Wxj0m5LJtMxJTZ4C|l)Hmi5LpJ{Ds_I@Q2kW^VnC$G&{+~OlBFcF=T70$} z-l#bD_5j^UnZuL>B?|6y1uxKp+s|R$AR4+TNZd9tR^xm$M*F5*S>_=**4Njsp7|=5 z8C{i@cz*l+}+Y>Yi}J-$dm==jX9;eUtdbJvGNcgHBS zJv;!DdUzcm+4v61KafOv)KE7~G6+sgR1UqdoZbLESF9;o=8UI;n_XozD=li}i}XKp(ZDzNt-265RSaEL>N2D>}A!(WVOEZnU4!Y^{zx)pyw(pC- z|GCv^KS#}N@m&owJ=|I#H1r2}*xFu&z1QYw1=XK!)BeeR(`=+j^3i_A4BJgL5Y;v? z{;Rh%VDQH6U>p}<<%i}^B~xqm zY)Osn@u0j0hB7kMA}}{TzxewIX&)G3#h>?S4|6WUXbMTGS0BNnpihs(i3wKLk+*bK z)@!$~u(TLTqk`zCE4&*a4^8xW4)`WF`{uSio-z1dPD#`Dyps0IR(2s}ukNwFZY;Lz ze^NGGzL)u3eyrRPOz5_`*|M=oYk{@2adO&Ye0D}q(v0mdtypn#-1LjB@E_zx-Zc zd-L-Hd-8Mbw(S%E3P+ito2;cjDvdd{VPf%N442#K^zmDaN40jxewL|LBDD0_2{q+>9qDx62AtR_;?ND%=8_*FenIeDNp{ub7R| z*@~VX_e?<52z2lczdTXPzyKSmj_=2b|2Zks791N|Y3g}jyNtj8WH-FF4%xKE{SYK{ za`u~>|GPE})*z=iKp<8m(9qkv(vQ}<*&1f4liT&-REXq5M-#i=b|zmduY~GiY0`GS z*pNzb3x!gvBef?e*)gw<*{^A=NcK@wga;D*x-L}D90M8j^0D7fWUPIDYcN~RdDQNH zQyYUSDr$mKVr9h#>{~*8_ZAf)Djl`Xcl0-`-)d+RNLL{ z@JQJ7IG#@PTZ=wT2R6p`vNs5_W_(I!CjC?U@^N-=D0(v~@z&;Dsh6x-S&kbAZwiv1 zPtvcU2>3g)Sv~WxatScuV z6Y&D&B`omVZ5ZHX7V_dmZ_mMGLe-iWk{9lX1>0%9frNbfT z%fAQ4%KxI}WAtPY_C%_h4$blrO}F+`T#0;8(1~kIb(Md(EL_=Czudg~>gSC5v0F{o zA+|W|_r$KManhH3Anh>yhstp8AVe4Nx*W?e>J??__>f=}0P0#Rv{i*i>1aJm`}p zji9^CHk8RS?|F8vcS?VJaZ00ftu*NI?Tb4uEiEl9ETqbr4UYqKI$LbUoYr(LCB()x zH%pwG*BcEl<`QG6dwJe+^2=rHWdS}{)V9w3rRwC){H5B$FdQ80YC8_I@~t#J=A$!M z4KNXT;NSbEBL|~i=RBcT$48{>p6pwW%>~Zfj(^&knaLSZ-#efDl6}t$mb{Qn1C{^= z&Zp>OKesJ~W+PuOp!Ici%aqm3U3?eIg$M|w#lRcgP1eA{ zLNdqx(sGzd!6R*4+ViC(0z^?5GX~)zYM1nN%whbhd+xvbu~%ql*}aDPajblbvp-t| zOd6KkTM}ziP}%4-i>YgAIUXr&JQHO(GoBi3jIQ|2U>58hMHy^#t}ft#x;+M(KXjCj zJ@@y}9Gx7I*WZeC8y(1Z&EHK+d1M)cQ02Qus{evULIQAJS=2NH9}NP|7{{gljqs{$GX-og#UMk(_OpzcZ5l6V0s5d>$$nV3G zt&hcM+Pv@hPq{d5F723Zv-K*7c{UtJ#Ath@tU`3Y;?U&lB^92QmbN$;^$3L!Sq$m~ z9JR2JG3~2kq0{)i+Q+LwI*F&{Egv++j-srxipqQ?3@It80;o{va)Wzv=+B=&Pft%E z;GhGq+s>b+1Twc}yX_9QiBcs(P@saE8fhqI-Rf8VHqD6)jUFoczT^Ed_~cN2etvFl z?qC!Me8yIK&;bs*zpCo8lX6h%H6!En>gwvBKg3j2Ali=h&qQv$hT4?o2J!Z zTBX~jT%>FvL0ha*qn{ZBf_>WB9^wPIyYn;k?K&O8A(Im8sSAFT{)!P7#|VP7>2a%x zm+*Nx;f_>)f8|y3Dp61;le`pgK5l2~4-BlInF&hvwYHA_js!D%8sYo#+}-qG*$nMD ztLk)=b3EIhBQd+bK$>)dNZ6SK%gUM&)X!ttV^1=_;hl0wzPnrZwltgY^xRbRYbd(F zy2$hKkToMIi5fxK(1zYD>Bscy90n|eP5!}n8Wa>1=*&Pdnv);)D z{R=^S9RY{EVD(o?qU^m^MGjlJ8SCHdXV~nv>!}lvAp1f#XuXB1V%p0G6~FVYHwg6s zwSkY1L#im@+@`s?!h+6g@yfsA%+s^Mbo{J_DA#Q&$0xe06bSra;pWbYH0*bs!#lrN zet8m8nr%3ugjG|GCg_l~LL~y!fVTEb>1KzDITMwnxQp1pW2Vo{Yy>_Fd3%8T@_o!d zND#*8p=rIgj*gPT!l#!PPft$<%~~O=O69WXxVX%nM%pDz$+c-d~R|wCZ=d_(`_5% zUM~C&c9b?WqVbb?DFh}TX3A7gQ|9ZuElteKh2 z2oWPMFPj>=zU(`fgg62L?@|RQUIPL}Nyg%ztTvcgUHwC`GKZM-B@LoPLW%>WdVnNV zm22uxaGzHmZmz~ML3Kq%9^cNinVk4|mj_FR3MhE{<_1;}g_?=sQsMmoc=Gr7*u1<6 z{r2T7J7)!olhY}soQ13){Pc43qFQ&9p1KSqIY0@h{O&*Y_VTYE-DWZe`uqE)r!Qv< zEXUL;DZY<9Jl$lejvTZXNO)M%i|557;4STDT+;lrs~Grf+9TuQS{fUzFPi>&{7((; z<^SrJFWT4tg$w!rU*G(HP*wkQDKd*|KL3<6yXSz)M?f((K5jh%F8iJH z)rP7~QP8;mku<1-#?dr@v8=4j;v(mt^>=dFZ~hNd=KttE{`ZQS(YjsPRPXiU3}(>d zWZIe9;{>KLc`korNna1exNu;m9aMbW;wt$ek~~%qg9dESuzCdPeX)Y|>*M#&zbeY{ zWvi%6Css!cWZE6;F|@S4_Gf(x0Fuugu3@v5WYhy6?a1v?6MVA=w!5~QzreeW!{Ex1 z_|sFtj;-RHm%X{X5Ht-zZaBJuwgK{e2+0wqu~L-{f?p zwgj>{M?e+${$QVDll0OGIa}>IFkf~c=B3(Mtc~tU>noXFJ@G1l?T``+j;7K2BW74mcjbDV4#hZ%01N=_(4mq8J=I}Aif&oe($vlk2j473O3cowmx<<~xZA9)ey7uDd;kp6~8b#-ad))$*f%Grd5 z3kqG_vL==>HCzqAs^}o;@n@(LJ;~QFayB^_jjJ6ND&c#(GfGRAS6t?ms4n|Q_Wj07 zIT(CXXK_=;*r+J0PRwd9$|ki&hJ)IUR5qCnGSJdn4=a~^&d^}%7*j82dW57GPhXmt z%A${b=p8G9s)8GqZd6Zt0ha0xS~|Tdpb}7Hu(gzrvBc=v$#^}VbYmFEwYQ^sdHvOC zfsKr$0eP!hAgm`hr~{9xrVifXf><Cxm zp=d~2T2Xhms#W4tc9n}Wd1g#?bz~MNT&caYwUMoDsj^ye5&y&lo##`nYWmpna`EnB z-s91JGB&mpJ^cX=jyNieOMz`-W#wLF-I8xPb(Q0H zFkop}XR)0Xh<@;eNBi;h717D-3iaT>Hm_vX!Vipc z>?vE<>*y)=bbnkZ=B%#S!UUzueNN=RbG4$Wf9y70T zFiz5tXd7zY8;|(Qd7-)h&fX9hK}R{YkMPz%$E|-e94r6|VswBN5h1Krbd1z19AQXN zdSR0KJlMh^kGZvkM(Xu-(x0CvAwIj6skG-%a_c7ZTYi7pE`(TJM-j$cRq?eJ8P7cN zF&H)}H>6h-m5Q?;;|1(&V{#0OougOvg`A_IrQxgX0qbnjW+QUwOP@d z?49bu);FEq>JSxss|^Ctlbp`p9u49cr#ku}4G6mj+>W7C&$W)rCSJt5&KlsH=FnZY z-b*AvizVM{IgB#C-Z@TBH&9VABjj_p8H!E=(H8mbcVvZytF7r|HP9Q_sGfoA6(l50 zL|DFW4%@(sNsv0xYd){M4o#so@VV;Jq!Dk4L^0OxyL7Rsy3>?FM=aJ|<0PusWGeO~ky6 zZ?sM2b!!t>rP9H~hL4cZr_td!o+jgEb!Eq9bJh778X`c;BO7BePSrKAy5HnOijb0( z*)69tQ{Ek}RvHKvw_ITa5=$Zd@hw;qf8#C6c#PmT?}J6tS-uu!721XeH0bqwGTA#W zlmQCeKHPGMIZYdvNpkXBb{lFNJHl|q2ImEl6r=cFp2l7*0HFzlg^4d6!$)YZM}O~J zqAv(a?7%ySxv_&0tEy4$yh}`evb*-8)L!LW&&@ECd}P+sVSDx^CY`PgdBA8i-mg6> z2nDENQub;R+!7rE<@aLfI|YJ>!+sB^&5_3Wx6|xN^6|BNRsAY`-m7KzbS~(O*oAS= zQ(Vk{*y~0LE zpp$rP0Nju^*{BieeeltqqIZp8gh(q^`^Za-D!x(w?S*NV(Q5Lk`0_i1I?o~@4C6?d zcBISAl39utH4(j;Ou#)!j1HIE@9}9+aBJgl-|P(DOK&k|2HV~-o$!Z|szx?((kMTF z4JBnNy*8Ws)z%}go%aE(-@_@$kYvFYi__1Dn0HjV`W_iOK0U@3_GiGW)OHOOw&S6+_G zsC#@V3IfG}4z#Q+69XiIt%jmy&8EoFT#AZ^^jmD%bbo@P_xOBIPXiGd@hgXuJ^mAk zGCBeuT+YkYkC5;)E^a-E@jqZsVc~gseG>0t@G_XlR5hRj-?)#f+uPf`zP^DMbF}Z% z`w2?%8_aOj2f)F1JTCD}Jw=XMZ~KE;K=2IN-s0M4t|(Sv9AXM|f%z)I7*N`rFSp-; zOARbyPU)vk>8nb87zqpOs!wQ1oKd2A=jcyrxmHFrR$}aL2<$-)%@xGl_tW+DI}tIb z!@p7kc;#LbT{Bk{@`#3Jg;-up`+JXh%@acv1Py!9_DXW3mXhf|y0yh)l<{(S?-XlP zm*!YY9$oaI)1KHx~@gw3fD z9E#Zen3c*pwH#{@(DbXh62f9BU}fAdx{ zF)7H>`9dAY5*6#~@IYfA8#TW{2g077Uhi^2Hc^;jpf3QWm^n36^)?H!QE{|t{ruoZ z2(YkDkMkNDZeFi+78aW}>1=G&ppP86e>t#XZ_2^5WfT{~Mm2a7*e2WwcI> z>-lb?%&a5+elb_=oglY>u>t2@a9w3sm)`SM|Fr$tU6TK`Wo~)ctS^-wjTb3{X;*{M zI6dNjmB8viZ_LqA@u5a7??;b?kIG0r6D`L=(i{(Q&F?ggWL0T zr$YIl(!%fbU!x1Ny59-RPOy=>eas=FzY>1D|J~GTJ(oNh;dY=Iz3$3IkAZBzZvZUO zp&SiDC2}K7&aKUNf z2J?xOdCK%OY4UjO%`i*dy)FO-cn&Q5~Nk4=NG=pra{s zS0EURKnm2EIKO)06dj+<^^`x?HTo)mp`pU~eVS^s zW$elSEG|P`7F|1R(3U^^|Pgzxp@^L!L5Zp5j)qA}v`IPnHUg38n6mXc&>KT7Q&caTR=P~kY!}C4 z|C7dHX@M;v56sGHvq+YJH)EL+u(M7)7atV*T-)dizZs~2q`4I67wWL6#=3PkKCk` z2ribh=XqrD>G%`8?4yf9#ip|i1fqjFM&~PXi8GxfBHL*QcGtz>RNHCR`iz?z=v&vq z*5%Z4s?J}#`%^!-78Q<-*r#kjFQu=8{A#w5)3_564kC6X zUZJA4fGBP34f4ws4MpOFg}FIh*GP(HF^?x~R8m=&wj2cmCMVyLi24?aKE0)IaAfl% zQ>Faxcg_Cf7S5Yf65tw*c?BPV z0L}XyK^PfaIKBn!v3f1RS6skCMOpJC+v9#mD03)M6e)F6Q`vH#2feOsK{ zF7nUsz)z%;eZ8>$Yhq}Ga@v2!gyVC-7eUq_XjDou@D%pnSqiCyT|iEPriZWYgtlHQ>t$UyAAjFTY+7ZKWW0E>KzGYoY~^BtZ#CilhkQ9Pnj%t- zL(y8F+UJ**QJ#ah-dmRGJe^(YSdsIr+Oi9(owBPDFbi1lD&?j-*Sc*6fl}y{I8A<~ zx_&Z#PoZHWO|PeBppTSuUva`HnVscrn|4^;f?X}XMrxNZKPcXUrDmeR4vn`}nsl4& zD0TiEbkx;kPCrRM=Sgk6wXw3H!wq^!o$TifIs-gIQwP%*#3_+kk)jnM;*+FLQ5!W2 zNPKjVRvEJ_OjBuqBhKqyXjDjwC5ph^@(asiOGpW47w1eaglH06(J_jHqB&(+wTjWT z1yi+%!hO>NdBtyv^b}QTPQ;>LEM+XC;IRT6%I{U-3LxN-e2}b>k>;Bk-Z7%kohMoL6C2GjS6_qrPIrhHH1-^~H_4*4lCL4S)irvEZ zF?mlzn>RdbJ?jWl4NjIGKVHjdXEjtNXWk1q;8AmpTxmpmcKZ8-G(0pm6z+mT@P^Zi zqt>SObANLbO(UY03CHFa*GjF@!bnda6bd8{^(~(#mQ+_uZY1@Qu?zOIyL}MdykI z|AokC*wV4~1abI=QPXzyc4s?Avj-ka{e}IFF_PxIAd>LT_Cy|KXU+3JhqY0EBgYfh zKSnea8ul}8!{4XV{Zc7YU$~#CfvM*J_;NUS9VDHneW+XB{h9Xx(9YeW)~ldZQJZh` zOm634-U+tLvvZce*SuVTcNmJS#3%$~=8{8H(l~QmhAI5Yl*?=Z@})y0HuBfS40xC;K2=}FXH!Y1mg4Vc8+O*4R@8cJ7KZ!u+Q zQ`aHM-8?82t`Uk&Yt7`e1vZ>~`fPzHqm)2NoLT(mL%L9wm_%+WFt}k6qGGr00WSPeKGH#2#3BBk_c9rog^>t5jxckxyc2?6m_NQ;LW``d+@?B&RJ9j_6ke&4f&eiZ&z#VznycL{l#`7R zRWO)Mp+fdA-;NL+JeDRQw3-%z)*R+Z%ky?1!bKjZ`B2mzHx*YB@<^C7s3C7YMp09V zJ<^R|_A5Kg2{<&jmN#l<(Q=9CNc*`igCPMqCQYJ{o-yAuJ@Pb;ei#R^v>TW&;tb@9Lx8P3z4n7Ohut)M0Vd zO6rs*O*^JOyIHY8LLr8|CE<{a_?CvMBArpTVd$KzuKsGWm1aLn*d^(SVML?P=|-6} zYT`6nn9J#s+WyPNP$f@guf`WYDVZ3|9KLR$Fu6>ceY}ilgS{SCQ!WVmTl;(Jk&fx< zl=G6KuiGikGZ}GN0+Tkjm%EqLtX(U>t+S=Pxm=Dkh%{_mY1!`6lDaM>cSPB=S3_!6 z@e7g%Vyjknn<$1ebmBn@O!S*~VN3@?-D>&yP`Si0QF~xrIGUsXZg^F31*D!5!L2GU zIk8Rrn91!sW9ekfXa97CXyW`eugUJ^Y9XvH&ogtExewUeY2a z^G~)=BuNShR1~7^Y0t^y#4V^<7==&j8_*ZKD(nwFJO0TpsNMx1U(^paP&1CMQBUO! zoyHbkB{|4DxFkk&eu*)Ot6zihf`}9_6#0C!#}5S-il;>jeWfDv4#hnNh>9{|&!jd^ z7lbGB4h+#t-_){O9${~8OO5)zvj}>aAdJK09}h%Fk)$bS#vq-_PqyQ0MFB zJl1nSlGqnbue3t^B#Hr+LED}#6{ux7#{9736`m=c1;^2UL@0Y2=AKY!u06&!=Z^38 zJ1zr>po7v2A#ISt^?2t8W|B+cF?2ZV_YcWyKw&$%3&n#Ka9QfxoV2h}fE)vvYpbX` zNX2TZVK1sp;X0OfN^h~LdC|a&#nsa};oK)}CnEvR7gl?Ly#s)?cp0k0;C|tvS^J9QG4x|<><~9t&LcbhgGL%s=6nZ~T$#IV`9qP9meTK)Ts#lv7M^9KYAE(B z#K00wi}c1f*Jl9h$8T@%`qn1wTU||G5|Zx$lUF_S+kL`r%L~g3P(6ebYc?C}Pw)Fs zknUrS@XKw z{7s1Lz@gFx3wzCx(s=2-q!+(A14l7OgZ>p<(5}kipDeBT?t)%v(!}Btw5GQsFz71N zN`ud*L0jGT(!T5>-01%h9)4^bmt;*%#0sDwNUNOC8>NhM=IvYdeGyisH)IXM4h)&s z|8mwdt-e4l)D?iTN;XF|3I(r2w%+#<;!RjJxje>MtG6>07*kDI&3a+xoBFO*NRvpf zxzIE6eJ#AIB&hV;Iul`BOXYn1+u9qk2Xafzi*Q`#RTW8Qp$yM=3nD9`zbIr?DSJ=bM4dj|n+?NhFf|_BpwhQ78SwQ2@?oZ)q@q?k@Af#q-8u)xz`V zh36W*GK02BV`RnH9lv7O2O_=C2MYLeSf3I0;fdA1ZV9-sW=@S=6WPBm$6HO%e|swf z@&EBrnExNo1pYt%2(svZoSOfufA;I1E5nivSMv|@jXOMv3%rrZy(Yw``YD@SQE{&> zG4i!L{U#>3$M=VariX{cNA8$txt|_^YuFMhIy#i-nXuq}m?wzm1WQ9hn2H7|5-NU2 z3L#R)Q%7*xg^VL`QZX`S*gA>Y?98Z1q1t`sm!o9X;^3r~3u^OK_>}7M3-j0`*Wsko zp`kp=8qzzE`|J;n;=Y>bJB7#Kth4E#TI;eoW6m@d(W${rAR zx3ct`j*bddK-sRG*_ODdC+Qqz=v(X7)Y=PG%^jbqGy^T*=}rwGx4FK)Gv)ue*udb38xTU)_VxDHOr;KLYRx=^3XBgUIyyTZN&aE;$_nTD43#@NI7103yrrvOGcJ?uj-N>Rdr@K}YkeHJOdM zVKm`P(^Ieeayv zi?{KgZWlboxjUB9H}bVL`p?{CWa!bC{9o}23@lu)SWZsxu8A!M!V`LGha&zu5gwik z?j)_q3i|Kva?khnb`+AoJD$g3U_ju?^JfJN|LtM^#j3$a#?MCfmkXPKr*mQ42=Yu$ z7H)J@z{=8cyY8L^OUpQnf2vtAmHwXhHTs zwV01dUrjo17+A=G|2WmkX~fDhU0Ae>B-N-J6{nJ+tQc#Z zzzr=kP1kdTID%0rceE^njQmkn$o|q&Mj}4w+?ZgP>#LJDYmS%IdV8C3qE#LWxzgTK z>TWSrC1=N2Td-iVegKOSXGXI_dxj?@apPeuZ&q>kYoN!FzY3lvMBECJV-O>!}og^RiPsi7aqB9qM60 zgIX(Mk+1?7**KbKnge402K|wdSyQVZ@J`rB@zLvuJzQ9<&i;0HDF83jf8+jj+t5nq z1)p@9Sq+w^ijsh$+UQ=v%wTRTHC~IvD0-fvf3uvqaqo~CEj9?R zAZM5qn^q&@XeOL@Q8X?9BfWEi23TR>K#ZO(TQ;1JNL1DwFRxIcq3I1*E>m-H`T0hv zAwmmAGN|(}?nA`}J$g+y#I=?HLMAG)zf&zsUt=ChHrXf}|2IluNX%yFEHR4BO zO_KI@cigl5DMriZWlC+mR#!!Iw%yu`lc=%h3#r4P2+2!D1$(}~@AGqcp>)++hoj9- zce`!0D>z&C50HY=lbt*&ib8iXi?hvP6_F@&V6DZGL8!i#>7;jU>HWCYM1`}tIk&1y z=jEJan%|>tVmWv;&d!t8I`T;lz{eNjsmamCD(L!Crf8xjDBTWR&SRG!qQ!%CdwtVj z9n!2_DB(h2LWWs|#ID;zkcTO&eU`MAtve?VC&A$OEkV{?nY!Sk!0t>3y7Vr6@lZ}3 zylFnps=aY~suohowk$7KXE#q&KHOo=eMn3gT z>;s022N8J6dnD|);DLL0xibTp=7fE>D$dr6>#d>Z93kZA-{!{T8TVUoLRG$OZ@k$vZe*!Y_Q)SOX@(0mLZ0OIB0@l)mB)Sz6^8oT87 zb9(7^7z4pUbf5;?pQC=clcB)AEz{zgE`IN%dD2BolsLE2th4V~ODHla2B$8i@qUj{ z@I~LewO`yxrRKeRnqA~$l)qb3AY(Iv0<(5H%HFKzR*ZQwjSdPco(E&oC?x`Wcj82h zi2yzUPLR-!Gh0xQ9 zDw}3;dRp#!d2CQ9#XdVl6L!eWjgWzFzcDhh-@%^R)MUc?L11FGZ1t{)=;D$RZ#G-P zR(zT^xhX3{J~WhSt;V1y5lbLhaBDI*694T(LSpar1r_HRuo7jZv+kVDdo>jBUckZ{ zdjpYQXY|QOgSA0#96`Paufa{zK=|3*88E4#>`?eQ^4JYKam)iadBjk zgP-6*J`3x`Y|7h=Dmjw-vwd*Etq>i}UzfSWwj%87T6C#iWF)%U|MP9_6ked+2JOW%J ztuN%ijsLuwS4@iirUOy~&}@P%&?1(S0p3o+Bw4y3)&PLLOJ;{UVfW%7C4S(gBQrf1 zX#Yt=)zU)kqpFDmvoUb5Y)giI3sVzU_VEm+9V6dY)Qj`MQKiA_vPQPo_bgB%kGFh-hNvI@5_;EJ zMv(HQ7pxvK`nVL7Wfltr`ZOxgnA6eo%BQ z#rW`_YjdwMotEAr+;>^t^jM3QTB>g@cBtPqge&RsnHm~uav+3-7yi>*mwAG5Asu92=~*~*l5LtpIz4uRV;+j^T_IT3Xw3ff?{Mx$2a z(lWIItm~$&!UFVdC5*Oz%NoD7M-z*x&ujdkb2AW`4-l;I`s@pDG7{z^yh#^UWpTV? z%=X(Lq^UAT;r;q(q{b}0sz}Fk+ys`0V!IL8y_xL7y;C|GJ9*=bXJyq>Z=b V->3&tbpK@2N{cIqRg3%#{9k114hH}L literal 0 HcmV?d00001 diff --git a/kxmleditor.lsm b/kxmleditor.lsm new file mode 100644 index 0000000..bef9475 --- /dev/null +++ b/kxmleditor.lsm @@ -0,0 +1,14 @@ +Begin3 +Title: KXMLEditor +Version: 0.7 +Entered-date: +Description: XML files editor for KDE +Keywords: KDE, XML +Author: Lumir Vanek, Olaf Hartig, Mateusz Korniak +Maintained-by: Lumir Vanek +Primary-site: http://kxmleditor.sourceforge.net +Home-page: http://kxmleditor.sourceforge.net +Original-site: +Platforms: Linux and other Unices +Copying-policy: GNU Public License +End diff --git a/kxmleditor.spec b/kxmleditor.spec new file mode 100644 index 0000000..b89b00a --- /dev/null +++ b/kxmleditor.spec @@ -0,0 +1,45 @@ +Summary: KXML Editor for KDE 3.x +Name: kxmleditor +Version: 1.1.4 +Release: 0.1 +Copyright: GPL +Vendor: Lumir Vanek +Url: http://kxmleditor.sourceforge.net +Packager: Lumir Vanek +Group: Development/Tools +Source: kxmleditor-1.1.4.tar.gz +BuildRoot: %{_tmppath}/%{name}-buildroot + +%description +XML Editor for KDE. + +%prep +%setup +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure \ + \ + $LOCALFLAGS +%build +# Setup for parallel builds +numprocs=`egrep -c ^cpu[0-9]+ /proc/stat || :` +if [ "$numprocs" = "0" ]; then + numprocs=1 +fi + +make -j$numprocs + +%install +make install-strip DESTDIR=$RPM_BUILD_ROOT + +cd $RPM_BUILD_ROOT +find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > $RPM_BUILD_DIR/file.list.kxmleditor +find . -type f | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.kxmleditor +find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.kxmleditor + +%clean +rm -rf $RPM_BUILD_ROOT/* +rm -rf $RPM_BUILD_DIR/kxmleditor +rm -rf ../file.list.kxmleditor + + +%files -f ../file.list.kxmleditor + diff --git a/kxmleditor/Makefile.am b/kxmleditor/Makefile.am new file mode 100644 index 0000000..58a534c --- /dev/null +++ b/kxmleditor/Makefile.am @@ -0,0 +1,51 @@ +####### kdevelop will overwrite this part!!! (begin)########## + +bin_PROGRAMS = kxmleditor + +kxmleditor_SOURCES = dcopiface_shell.skel dcopiface_shell.cpp kxmleditorshell.cpp main.cpp kxeshellmanager.cpp +kxmleditor_LDFLAGS = $(all_libraries) $(KDE_RPATH) +kxmleditor_LDADD = $(LIB_KPARTS) $(LIB_KFILE) $(LIB_KDEUI) $(LIB_KDECORE) $(LIB_QT) $(LIBSOCKET) + +EXTRA_DIST = main.cpp \ + kxmleditor.desktop \ + kxmleditorshell.cpp kxmleditorshell.h kxmleditorshell.rc \ + dcopiface_shell.cpp dcopiface_shell.h + +install-data-local: + $(mkinstalldirs) $(kde_appsdir)/Applications/ + $(INSTALL_DATA) $(srcdir)/kxmleditor.desktop $(kde_appsdir)/Applications/kxmleditor.desktop + +uninstall-local: + -rm -f $(kde_appsdir)/Applications/kxmleditor.desktop + -rmdir $(kde_appsdir)/Applications + +####### kdevelop will overwrite this part!!! (end)############ +# this 10 paths are KDE specific. Use them: +# kde_htmldir Where your docs should go to. (contains lang subdirs) +# kde_appsdir Where your application file (.kdelnk) should go to. +# kde_icondir Where your icon should go to. +# kde_minidir Where your mini icon should go to. +# kde_datadir Where you install application data. (Use a subdir) +# kde_locale Where translation files should go to.(contains lang subdirs) +# kde_cgidir Where cgi-bin executables should go to. +# kde_confdir Where config files should go to. +# kde_mimedir Where mimetypes should go to. +# kde_toolbardir Where general toolbar icons should go to. +# kde_wallpaperdir Where general wallpapers should go to. + +# set the include path for X, qt and KDE +INCLUDES= $(all_includes) + +METASOURCES = AUTO + +rcdir = $(kde_datadir)/kxmleditor +rc_DATA = kxmleditorshell.rc + +messages: rc.cpp + LIST=`find . -name \*.h -o -name \*.hh -o -name \*.H -o -name \*.hxx -o -name \*.hpp -o -name \*.cpp -o -name \*.cc -o -name \*.cxx -o -name \*.ecpp -o -name \*.C`; \ + if test -n "$$LIST"; then \ + if ! test -e $(podir)/kxmleditor.pot; then touch $(podir)/kxmleditor.pot; fi; \ + $(XGETTEXT) -j $$LIST -o $(podir)/kxmleditor.pot; \ + fi + +noinst_HEADERS = kxeshellmanager.h diff --git a/kxmleditor/dcopiface_shell.cpp b/kxmleditor/dcopiface_shell.cpp new file mode 100644 index 0000000..a03d149 --- /dev/null +++ b/kxmleditor/dcopiface_shell.cpp @@ -0,0 +1,39 @@ +/*************************************************************************** + dcopiface_shell.cpp - description + ------------------- + begin : Tue Oct 23 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "dcopiface_shell.h" +#include "kxmleditorshell.h" + +QString +KXMLEditorShellIface::Quit() +{ +// m_pKXEShell->close(); + m_KXEShell.close(); + return ""; + +} + + +void +KXMLEditorShellIface::FileOpen() +{ + m_KXEShell.slotFileOpen(); +} + + + + diff --git a/kxmleditor/dcopiface_shell.h b/kxmleditor/dcopiface_shell.h new file mode 100644 index 0000000..63a0f8c --- /dev/null +++ b/kxmleditor/dcopiface_shell.h @@ -0,0 +1,70 @@ +/*************************************************************************** + dcopiface_shell.h - description + ------------------- + begin : Tue Oct 23 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef DCOPIFACE_SHELL_H +#define DCOPIFACE_SHELL_H + +#include +#include + +/** + *@short DCOP inteface for Kpart based kxmleditor shell. + *@author The KXMLEditor Team + * See the shell iface as an user, who can perform the _shell_ actions a live user can. + * This means opening a file via an fileopen dialog and not by giving a filename/url (this is up to the part's iface - but read on, I'll come back to it later). This means your openURL function should simply "open" and should show the file open dialog. + */ +class KXMLEditorShell; + +class KXMLEditorShellIface + :virtual public DCOPObject +{ + K_DCOP +protected: + /** + Pointer to @ref KXMLEditorShell which iface manages. + **/ + KXMLEditorShell & m_KXEShell; +public: + /** + * Default constructor with default name of DCOP object used by @ref KXMLEditorShell + **/ + KXMLEditorShellIface(KXMLEditorShell & KXEShell, const char * szDCOPObjectName = "KXMLEditorShellIface") + :DCOPObject(szDCOPObjectName) + ,m_KXEShell(KXEShell) + { +// m_pKXEShell = pKXEShell; + } +k_dcop: + + /** + * Closes entire KXMLEditor. + * + * @returns Error description or empty string if program closed. + **/ + QString Quit(); + + + /** + * Calls and shows open file dialog. + **/ + + ASYNC FileOpen(); + + +}; + +#endif // DCOPIFACE_SHELL_H + diff --git a/kxmleditor/kxeshellmanager.cpp b/kxmleditor/kxeshellmanager.cpp new file mode 100644 index 0000000..b20b1af --- /dev/null +++ b/kxmleditor/kxeshellmanager.cpp @@ -0,0 +1,55 @@ +// +// C++ Implementation: kxeshellmanager +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kxeshellmanager.h" +#include "kxmleditorshell.h" + +#include + +KXEShellManager::KXEShellManager() +{ +} + +KXEShellManager::~KXEShellManager() +{ +} + +void KXEShellManager::addShell(KXMLEditorShell* pShell) +{ +/* + for (unsigned int i=0; islotShellAdded(pShell); + pShell->slotShellAdded(m_shells.at(i)); + } + */ + m_shells.append(pShell); +} + +void KXEShellManager::removeShell(KXMLEditorShell* pShell) +{ + m_shells.remove(pShell); + /* + for (unsigned int i=0; islotShellRemoved(pShell); + } + */ +} + + +/*! + \fn KXEShellManager::shells() + */ +QPtrList* KXEShellManager::shells() +{ + return &m_shells; +} diff --git a/kxmleditor/kxeshellmanager.h b/kxmleditor/kxeshellmanager.h new file mode 100644 index 0000000..0eeff8e --- /dev/null +++ b/kxmleditor/kxeshellmanager.h @@ -0,0 +1,65 @@ +// +// C++ Interface: kxeshellmanager +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef KXESHELLMANAGER_H +#define KXESHELLMANAGER_H +/** +@file +*/ + +#include + +class KXMLEditorShell; + +/** +@short Available shell list + +Stores and dispatches informations about all KXMLEditorShell windows currently opened. +Only one instance of this class is created. Eeach shell adds itself into this manager. + +@sa KXMLEditorShell + +@author Adam Charytoniuk +*/ +class KXEShellManager{ +public: + /** @short Constructor */ + KXEShellManager(); + + /** @short Destructor */ + ~KXEShellManager(); + + /** @short Adds given part to the manager. + + All opened Shells will be informed about that event by KXMLEditorShell::slotShellAdded() + method. In addition, newly added shell will be informed about presence of each of all existing + shells with the same method. + @param pShell newly added shell + */ + void addShell(KXMLEditorShell* pShell); + + /** @short Removes given part from manager. + + All opened Shells will be informed about that event by KXMLEditorShell::slotShellRemoved() + method. + @param pShell to be removed (closed) + */ + void removeShell(KXMLEditorShell* pShell); + + /** @short Returns list of currently opened shells. */ + QPtrList *shells(); + +private: + /** @short Internally stores list of available shells. */ + QPtrList m_shells; +}; + +#endif diff --git a/kxmleditor/kxmleditor.desktop b/kxmleditor/kxmleditor.desktop new file mode 100644 index 0000000..556f62a --- /dev/null +++ b/kxmleditor/kxmleditor.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Type=Application +Exec=kxmleditor -caption "%c" %i %m +Icon=kxmleditor.png +DocPath=kxmleditor/index.html +Comment=XML editor +Comment[fi]=XML-editori +Terminal=false +Name=KXML Editor +MimeType=text/xml; +Encoding=UTF-8 +Categories=Application;Development;TextEditor;KDE; diff --git a/kxmleditor/kxmleditorshell.cpp b/kxmleditor/kxmleditorshell.cpp new file mode 100644 index 0000000..bbb6f02 --- /dev/null +++ b/kxmleditor/kxmleditorshell.cpp @@ -0,0 +1,495 @@ +/*************************************************************************** + kxmleditorshell.cpp - description + ------------------- + begin : Thu Oct 18 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + /** + @file + */ + +#include "kxmleditorshell.h" +#include "kxeshellmanager.h" +#include "../part/kxmleditorpart.h" +#include "../part/kxedocument.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "dcopiface_shell.h" + + +KXEShellManager *KXMLEditorShell::s_manager=0L; + +KXMLEditorShell::KXMLEditorShell( const char * name, WFlags f ) + : KParts::MainWindow( name, f ), + m_pPart(0), + m_pKXEShellIface(0) +{ + ////////////////////////////// + // CREATE ACTIONS + ////////////////////////////// + + setXMLFile("kxmleditorshell.rc"); + + KStdAction::openNew( this,SLOT(slotActFileNew()),actionCollection() ); + KStdAction::open( this, SLOT(slotFileOpen()), actionCollection() ); + m_pActFileOpenRecent = KStdAction::openRecent( this, SLOT(slotFileOpenRecent(const KURL&)), actionCollection() ); + m_pActFileOpenRecent->loadEntries( instance()->config() ); + m_pActReload = new KAction( i18n("Reloa&d"), "reload", Key_F5, this, SLOT(slotFileReload()), actionCollection(), "reload" ); + + KToggleAction * pActToggleMainToolBar = KStdAction::showToolbar( this, SLOT(slotToggleMainToolBar()), actionCollection() ); + KToggleAction * pActToggleStatusBar = KStdAction::showStatusbar( this, SLOT(slotToggleStatusBar()), actionCollection() ); + KStdAction::keyBindings( this, SLOT(slotConfigureKeys()), actionCollection() ); + KStdAction::configureToolbars( this, SLOT(slotConfigureToolbars()), actionCollection() ); + + KStdAction::mail( this, SLOT(mail()), actionCollection() ); + KStdAction::close( this, SLOT(slotActClose()), actionCollection() ); + KStdAction::quit( this, SLOT(close()), actionCollection()); + + // L.V. moved to part pActPrint = KStdAction::print( 0, 0, actionCollection(), "print" ); + + pActCloseW = new KAction( i18n("&Close"), 0, 0, this,SLOT(slotActWindowClose()), actionCollection(), "window_close" ); + pActCloseAllW = new KAction( i18n("Close &all"), 0, 0, this,SLOT(slotActWindowCloseAll()), actionCollection(), "window_close_all" ); + pActCloseAllO = new KAction( i18n("Close all &others"), 0, 0, this,SLOT(slotActWindowCloseAllOthers()), actionCollection(), "window_close_all_others" ); + + ////////////////////////////// + // CREATE STATUSBAR + ////////////////////////////// + statusBar()->message( i18n("Ready.") ); + + ////////////////////////////// + // MISC. INITIALIZATION + ////////////////////////////// + + manager()->addShell(this); + + setAutoSaveSettings(); + pActToggleMainToolBar->setChecked( ! toolBar()->isHidden() ); + pActToggleStatusBar->setChecked( ! statusBar()->isHidden() ); + + m_pKXEShellIface = new KXMLEditorShellIface(*this); + + statusBar()->setSizeGripEnabled(true); + + setPart(0L); // start empty + +} + +KXMLEditorShell::~KXMLEditorShell() +{ + if (m_pKXEShellIface) + delete m_pKXEShellIface; + + manager()->removeShell(this); +} + +///////////////////////////////////////////////////////////////////// +// ACTION SLOTS +///////////////////////////////////////////////////////////////////// + +void KXMLEditorShell::slotFileOpen() +{ + statusBar()->message( i18n("Opening file...") ); + + KURL url = KFileDialog::getOpenURL( QString::null, + i18n(FILE_DIALOG_FILTER), + this ); + openURL(url); + + // L.V.: tried to meve save functionality to Part + //m_pActFileSave->setEnabled(true); // TODO: L.V. Why File Save ? Why not Save as... ? + + statusBar()->message( i18n("Ready.") ); +} + +void KXMLEditorShell::slotFileOpenRecent(const KURL & url) +{ + statusBar()->message( i18n("Opening file...") ); + + openURL(url); + + statusBar()->message( i18n("Ready.") ); +} + +void KXMLEditorShell::slotFileReload() +{ + statusBar()->message( i18n("Reloading file...") ); + + // Try to (re)open the file. + // In case the file is modified, a Save/Discard/Cancel message box pops up. + if ( part() && ! part()->url().isEmpty() ) + part()->openURL( part()->url() ); + + statusBar()->message( i18n("Ready.") ); +} + +void KXMLEditorShell::slotToggleMainToolBar() +{ + statusBar()->message( i18n("Toggle the toolbar...") ); + + if( toolBar()->isHidden() ) + toolBar()->show(); + else + toolBar()->hide(); + + statusBar()->message( i18n("Ready.") ); +} + + +void KXMLEditorShell::slotToggleStatusBar() +{ + statusBar()->message( i18n("Toggle the statusbar...") ); + + if( statusBar()->isHidden() ) + statusBar()->show(); + else + statusBar()->hide(); + + statusBar()->message( i18n("Ready.") ); +} + +void KXMLEditorShell::slotConfigureKeys() +{ + KKeyDialog dlg; + dlg.insert(part()->actionCollection()); + dlg.insert(actionCollection()); + dlg.configure(); +} + +void KXMLEditorShell::slotConfigureToolbars() +{ + KEditToolbar dlg( factory() ); + if ( dlg.exec() ) + createGUI( part() ); +} + +///////////////////////////////////////////////////////////////////// +// ADDITIONAL FUNCTIONS +///////////////////////////////////////////////////////////////////// + +bool KXMLEditorShell::openURL( const KURL & url ) +{ + if ( url.isEmpty() ) + return false; + + // About this function, the style guide ( + // http://developer.kde.org/documentation/standards/kde/style/basics/index.html ) + // says that it should open a new window if the document is _not_ + // in its initial state. This is what we do here. + + // If there is no part yet created, create new one... + if (!part()) + { + setPart(createXMLPart(this)); + } + + // We have to differenciate, if this shell could + // be used or a new one has to be created. + if ( part()->url().isEmpty() && ! part()->isModified() ) + { + // this one can be used - try to open the file in it + if ( ! part()->openURL(url) ) + return false; + } + else + { + // a new one has to be created + KXMLEditorShell * pShell = new KXMLEditorShell; + // and a new part too... + pShell->setPart(createXMLPart(pShell)); + + // try to open the file in the shell + if ( ! pShell->part()->openURL(url) ) + return false; + + // show the new shell + pShell->show(); + } + + // on success, the URL could be added to our list of recent files + m_pActFileOpenRecent->addURL(url); + + return true; +} + +bool KXMLEditorShell::queryClose() +{ + if ( part() && ! part()->closeURL() ) + return false; + + m_pActFileOpenRecent->saveEntries( instance()->config() ); + + return KParts::MainWindow::queryClose(); +} + +void KXMLEditorShell::saveProperties( KConfig * pConfig ) +{ + if (part()) + { + pConfig->writeEntry( "CurrentURL", part()->url().url() ); + } + KParts::MainWindow::saveProperties(pConfig); +} + +void KXMLEditorShell::readProperties( KConfig * pConfig ) +{ + KParts::MainWindow::readProperties(pConfig); + +/// @todo Check if ths is a deadcode +// QString strURL = pConfig->readEntry( "CurrentURL", "" ); +// if ( strURL.isEmpty()) +// part()->openURL( strURL ); +} + +void KXMLEditorShell::slotEnableBrowserExtActions( const char * pszName, bool bEnabled ) +{ + KAction * pAct = actionCollection()->action( pszName ); + if ( pAct ) + pAct->setEnabled( bEnabled ); + else + kdDebug() << "KXMLEditor " << k_funcinfo << " unknown action (" << pszName << ")" << endl; +} + +// Set main window caption (by using the base class functionality), +// Enables/disables Save button (corresponding to the parts modified status) +void KXMLEditorShell::setCaption( const QString & strCaption ) +{ + if (part()) + { + KParts::MainWindow::setCaption( strCaption, part()->isModified() ); // base class functionality + } +} + + +// +// Called when creating new file is requested. +// +void KXMLEditorShell::slotActFileNew() +{ + + // About this function, the style guide ( + // http://developer.kde.org/documentation/standards/kde/style/basics/index.html ) + // says that it should open a new window if the document is _not_ + // in its initial state. This is what we do here.. + KXMLEditorShell * pShell; + KParts::ReadWritePart* pPart; + + // 1. This shell is empty + if (!part()) + { + pPart = createXMLPart(this); + pShell=this; + } + // 2. The shell contains modified part + else if (! part()->url().isEmpty() || part()->isModified() ) + { + pShell = new KXMLEditorShell; + pPart = createXMLPart(pShell); + pShell->show(); + } + // 3. The shell contains part, and it is empty and not modified + else + { + pPart=part(); + pShell=this; + } + + pShell->setPart(pPart); + // if there is a way to determine in KXMLEditorPart that it was created "for new file" then + // this part should be changed. + ((KXMLEditorPart *)pPart)->document()->newFile(); +} + +void KXMLEditorShell::mail() +{ + // L.V.: tried to meve save functionality to Part + //slotFileSave(); + + // first - our XML file have to be saved. + part()->save(); + + if (!part()->url().isEmpty()) + { + QStringList urls(part()->url().url()); // we can prepare then list of attachments (1 element in the list) + QString theSubject(part()->url().fileName(false)); // and set the mail subject + kapp->invokeMailer(QString::null, // finally we can compose e-mail (addressed to no-one) out of that + QString::null, + QString::null, + theSubject, // subject + QString::null, // body + QString::null, + urls); // attachments + } +} + +void KXMLEditorShell::setPart(KParts::ReadWritePart* pPart) +{ + if (pPart==m_pPart) + return; // nothing to do here... + else + { + if(pPart) + { + connect(static_cast (pPart), SIGNAL(sigAddRecentURL(const KURL &)), + this, SLOT(slotAddRecentURL(const KURL &)) ); + } + } + + if (m_pPart) + { + factory()->removeClient(m_pPart); + delete m_pPart; + } + m_pPart = pPart; + if (pPart) + { + // get the parts browser extension and connect additional actions to it + KParts::BrowserExtension * pBrowserExt = 0; + if ( (pBrowserExt = KParts::BrowserExtension::childObject(pPart)) ) // if there is one + { + connect( pBrowserExt, SIGNAL(enableAction( const char *, bool )), this, SLOT(slotEnableBrowserExtActions( const char *, bool )) ); + + // L.V. moved to part. connect(pActPrint,SIGNAL(activated()),pBrowserExt, SLOT(print())); + //pActPrint->setEnabled(pBrowserExt->isActionEnabled("print")); + } + + createGUI(pPart); + setCentralWidget(pPart->widget() ); + pPart->widget()->show(); + stateChanged("part"); + } + else + { + createGUI(0L); + setCentralWidget(0L); + stateChanged("empty"); + } + + // keep pointer to window menu + m_windowMenu = static_cast(factory()->container("window", this)); + if(!m_windowMenu) + kdDebug() << "KXMLEditorShell::setPart - m_windowMenu is NULL" << endl; + else + connect(m_windowMenu,SIGNAL(aboutToShow()),this,SLOT(slotBeforeWindowMenuShown())); +} + +KParts::ReadWritePart* KXMLEditorShell::createXMLPart(QObject *parent) +{ + return createPart(parent,"libkxmleditorpart", "KParts::ReadWritePart"); +} + +KParts::ReadWritePart* KXMLEditorShell::createPart(QObject *parent, const QString& libName, const QString& className) +{ + KParts::ReadWritePart* newPart = 0L; + KLibFactory * pFactory = KLibLoader::self()->factory(libName); + if (pFactory) + newPart = static_cast ( pFactory->create( parent, "KXMLEditor view", className ) ); + else + kdFatal() << "KXMLEditorShell::KXMLEditorShell no " << libName << " found" << endl; + return newPart; +} + +void KXMLEditorShell::slotActClose() +{ + if (part() && part()->queryClose()) + setPart(0L); +} + +void KXMLEditorShell::close() +{ + if (queryClose()) + { + if (KMainWindow::memberList->count()==1) + kapp->deref(); + delete this; + } +} + +void KXMLEditorShell::slotActWindowCloseAllOthers() +{ + QPtrListIterator it(*KMainWindow::memberList); + for (it.toFirst();it.current();++it) + { + if (it.current()!=this) + it.current()->close(); + } +} + + void KXMLEditorShell::slotActWindowClose() +{ + this->close(); +} + +void KXMLEditorShell::slotActWindowCloseAll() +{ + slotActWindowCloseAllOthers(); + slotActWindowClose(); +} + +KXEShellManager* KXMLEditorShell::manager() +{ + if (!s_manager) + { + s_manager = new KXEShellManager(); + } + return s_manager; +} + +void KXMLEditorShell::slotBeforeWindowMenuShown() +{ + // first we have to clean all shell items... + m_windowMenu->clear(); + + // then we plug-in neccessary actions... + pActCloseW->plug(m_windowMenu); + pActCloseAllW->plug(m_windowMenu); + pActCloseAllO->plug(m_windowMenu); + m_windowMenu->insertSeparator(); + + // and then we can add entries for all shells + // that are registered in Shell Manager... + QPtrListIterator it (*(manager()->shells())); + for (it.toFirst(); it.current();++it) + { + int id = m_windowMenu->insertItem(it.current()->caption(),it.current(),SLOT(slotActivate())); + m_windowMenu->setItemChecked(id,it.current()==this); + } +} + +void KXMLEditorShell::slotActivate() +{ + /// @todo windows have to be activated over EWMH + showNormal(); // show it if it's minimized + raise(); // bring that to front +} + +// Add URL to recent file list +void KXMLEditorShell::slotAddRecentURL(const KURL &url) +{ + m_pActFileOpenRecent->addURL(url); +} diff --git a/kxmleditor/kxmleditorshell.h b/kxmleditor/kxmleditorshell.h new file mode 100644 index 0000000..848e47a --- /dev/null +++ b/kxmleditor/kxmleditorshell.h @@ -0,0 +1,178 @@ +/*************************************************************************** + kxmleditorshell.h - description + ------------------- + begin : Thu Oct 18 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + /** + @file + */ + + +#ifndef KXMLEDITORSHELL_H +#define KXMLEDITORSHELL_H + +#include + +class KParts::ReadWritePart; +class KXMLEditorShellIface; +class KAction; +class KXEShellManager; + + +/** + @short The shell, which can contain our #KXMLEditorPart. + + It is the window that owns main user interface elements. +*/ +class KXMLEditorShell : public KParts::MainWindow +{ + Q_OBJECT + public: + /** @short Constructor + + Creates shell and adds it into one global instance of KXEShellManager. + @sa KXEShellManager + */ + KXMLEditorShell( const char * name = 0L, WFlags f = WDestructiveClose ); + + /** @short Destructor + + Destroys shell. Performs also removing given shell from global instance + of KXEShellManager. + */ + virtual ~KXMLEditorShell(); + + /** @short Opens new file and shows it in the current shell. */ + bool openURL( const KURL & url ) ; + + /** @short Closes this shell. */ + virtual void close(); + + /** @short Returns part manager object */ + KXEShellManager* manager(); + + /** @short Creates new part which can be shown in the shell. + @param parent parent object for the part*/ + static KParts::ReadWritePart* createXMLPart(QObject *parent) ; + + static KParts::ReadWritePart* createPart(QObject *parent, const QString& libName, const QString& className); + + /** @short Changes currenly shown part. */ + void setPart(KParts::ReadWritePart* pPart); + + public slots: + /** @short Slot connected to File->New action. */ + void slotActFileNew(); + + /** @short Slot connected to File->Open action. */ + void slotFileOpen(); + + void slotFileOpenRecent( const KURL & url ); + + /** @short Slot connected to File->Reload action. */ + void slotFileReload(); + + /** @short Slot connected to action responsible for showing and hiding main toolbar.*/ + void slotToggleMainToolBar(); + + /** @short Slot connected to action responsible for showing and hiding status bar.*/ + void slotToggleStatusBar(); + + /** @short Slot connected to action. Shows shortcut configuration dialog.*/ + void slotConfigureKeys(); + + /** @short Slot connected to action. Shows toolbar configuration dialog.*/ + void slotConfigureToolbars(); + + /** @short Changes shell caption.*/ + virtual void setCaption( const QString & strCaption ); + + /** @short Sends currently opened XML file over e-mail. + + The application will try to start default mail client and prepare + new empty mail with currently opened file as an attachment. + The file have to be saved first on a disc. + @sa KApplication::invokeMailer() + */ + void mail(); + + /** @short Connected to File->Close action + + Closes currently opened file, but not the shell itself. The shell + remaines empty but active, so it's possible for the user + to open another file in it.*/ + void slotActClose(); + + /** @short slot connected to Window->Close action. + @sa close() */ + void slotActWindowClose(); + + /** @short slot connected to Window->Close All action. */ + void slotActWindowCloseAll(); + + /** @short slot connected to Window->Close All Others action. */ + void slotActWindowCloseAllOthers(); + + void slotActivate(); + + protected: + virtual bool queryClose(); + virtual void saveProperties( KConfig * ); + virtual void readProperties( KConfig * ); + + /** @short Stores pointer to currenly shown part. */ + KParts::ReadWritePart * m_pPart; + + /** @short Action for recently opened files. */ + KRecentFilesAction * m_pActFileOpenRecent; + + /** @short Action for reloading the document currently open. */ + KAction * m_pActReload; + + /** @short Action for printing complete XML files.*/ + // L.V. moved to part. KAction* pActPrint; + + KAction* pActCloseW; + KAction* pActCloseAllW; + KAction* pActCloseAllO; + + /** @short DCOP interface pointer (if no such iface pointer == 0).*/ + KXMLEditorShellIface * m_pKXEShellIface; + + /** @short Stores pointer to window menu. + + This menu is expanded everytime new shell is shown. */ + KPopupMenu* m_windowMenu; + + /** @short Returns currently shown part. */ + KParts::ReadWritePart* part() const {return m_pPart;} + + /** @short Adds this shell window to part manager for monitoring */ +// void addToManager(); + + protected slots: + /** To enable/disable actions, the way the parts browser extension wishes. */ + void slotEnableBrowserExtActions( const char * pszName, bool bEnabled ); + + void slotBeforeWindowMenuShown(); + + // Add URL to recent file list + void slotAddRecentURL(const KURL &); + + private: + /** @short Stores pointer to global instance of #KParts::PartManager */ + static KXEShellManager *s_manager; +}; + +#endif diff --git a/kxmleditor/kxmleditorshell.rc b/kxmleditor/kxmleditorshell.rc new file mode 100644 index 0000000..2ddfba2 --- /dev/null +++ b/kxmleditor/kxmleditorshell.rc @@ -0,0 +1,31 @@ + + + + + &File + + + + + + + + &Window + + + + + &Help + + + +Main Toolbar + + + + + + + + + diff --git a/kxmleditor/main.cpp b/kxmleditor/main.cpp new file mode 100644 index 0000000..23b1f8a --- /dev/null +++ b/kxmleditor/main.cpp @@ -0,0 +1,139 @@ +/*************************************************************************** + main.cpp - description + ------------------- + begin : � �c 10 12:39:26 CEST 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +//#include "kxmleditor.h" +#include "../part/kxmleditorabout.h" +#include "kxmleditorshell.h" + + +static KCmdLineOptions options[] = +{ + { "+[File(s)]", I18N_NOOP("XML file(s) to open"), 0 }, + { 0, 0, 0 } +}; + +#define USE_KPART 1 + // if set to true makes kxmleditor to be kpart based (currently developement version only) + +/** @short Main application function that starts-up the application */ +int main(int argc, char *argv[]) +{ + KCmdLineArgs::init( argc, argv, new KXMLEditorAboutData() ); + KCmdLineArgs::addCmdLineOptions( options ); // Add our own options. + + KApplication app; + + // comment the following lines to use KXMLEditorShell instead of KXMLEditorApp +#if ! USE_KPART + if (app.isRestored()) + { RESTORE(KXMLEditorApp); + } + else + { + KXMLEditorApp *kxmleditor = new KXMLEditorApp(); + kxmleditor->show(); + + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + + if(args->count()) + { QString strPath; + + if(args->count() > 1) + { strPath = args->arg(1); + } + KURL url(args->arg(0)); + if ( ! url.isValid() ) + { // probably user entered just filename + url.setProtocol("file"); + url.setPath(args->arg(0)); + } + kxmleditor->openDocumentFile(url, strPath); + } + else + { kxmleditor->openDocumentFile(); + } + args->clear(); + } +#else // USE_KPART + + if (app.isRestored()) + { + RESTORE(KXMLEditorShell); + } + else + { + KCmdLineArgs * pArgs = KCmdLineArgs::parsedArgs(); + KXMLEditorShell * pShell; + bool bNoCorrectInstance = true; + if ( pArgs->count() > 0 ) + { + for( int i = 0; i < pArgs->count(); i++ ) + { + KURL url(pArgs->arg(i)); + if ( ! url.isValid() ) + { + url.setProtocol("file"); + url.setPath(pArgs->arg(i)); + } + pShell = new KXMLEditorShell(); + if ( pShell->openURL(url) ) + { + pShell->show(); + bNoCorrectInstance = false; + } + else + { + kdDebug() << "Couldn't open file " << url.path() << endl; + KMessageBox::sorry(0, i18n("Couldn't open file !") + "\n" + url.path()); + delete pShell; + } + } + } + else + { + pShell = new KXMLEditorShell(); + KParts::ReadWritePart* pPart = KXMLEditorShell::createXMLPart(pShell); + pShell->setPart(pPart); + pShell->show(); + bNoCorrectInstance = false; + } + pArgs->clear(); + + if ( bNoCorrectInstance ) + return FALSE; + } + + // registration as multi-instance DCOP client + DCOPClient *client = app.dcopClient(); + client->attach(); + client->registerAs(kapp->name()); + + // uncomment end +#endif // USE_KPART + + int iRetVal = app.exec(); + return iRetVal; +} + diff --git a/part/Makefile.am b/part/Makefile.am new file mode 100644 index 0000000..3a1e59a --- /dev/null +++ b/part/Makefile.am @@ -0,0 +1,53 @@ +####### kdevelop will overwrite this part!!! (begin)########## + +lib_LTLIBRARIES = libkxmleditorpart.la + +libkxmleditorpart_la_SOURCES = kxesearchdialogbase.ui kxesearchdialog.cpp kxeprocinstrdialogbase.ui kxeprocinstrdialog.cpp kxespecprocinstrdialogbase.ui kxespecprocinstrdialog.cpp kxeelementdialogbase.ui kxeelementdialog.cpp kxeattributedialogbase.ui kxeattributedialog.cpp kxechardatadialogbase.ui kxechardatadialog.cpp kxeattachdialogbase.ui kxechoosestringdialogbase.ui kxechoosestringdialog.cpp kxefilenewdialog.cpp kxeconfiguration.cpp kxesettings.cpp kxetreeviewsettingspage.ui kxetreeviewsettings.cpp kxenewfilesettingspage.ui kxenewfilesettings.cpp kxeprintsettingspage.ui kxeprintsettings.cpp kxearchiveextssettingspage.ui kxearchiveextssettings.cpp kxetextviewsettingspage.ui kxetextviewsettings.cpp kxe_treeviewitem.cpp kxe_treeview.cpp kxe_viewelement.cpp kxe_viewattributes.cpp kxesyntaxhighlighter.cpp kxetexteditordialogbase.ui kxetexteditordialog.cpp actions.cpp qdom_add.cpp kxecommand.cpp commands_file.cpp commands_edit.cpp commands_insert.cpp kxmleditorpart.cpp kxmleditorfactory.cpp dcopiface_part_ro.skel dcopiface_part_ro.cpp kxedocument.cpp + +libkxmleditorpart_la_LDFLAGS = -module $(all_libraries) -version-info 1:0:0 +libkxmleditorpart_la_LIBADD = $(LIB_KDEPRINT) $(LIB_KPARTS) $(LIB_KFILE) $(LIB_KDEUI) $(LIB_KDECORE) $(LIB_QT) + +SUBDIRS = pics icons + +EXTRA_DIST = kxmleditorpartBrowseUI.rc kxmleditorpartEditUI.rc kxedocument.rc kxmleditorpart.desktop + + +install-data-local: + $(mkinstalldirs) $(kde_servicesdir) + $(INSTALL_DATA) $(srcdir)/kxmleditorpart.desktop $(kde_servicesdir)/kxmleditorpart.desktop + +uninstall-local: + -rm -f $(kde_servicesdir)/kxmleditorpart.desktop + -rmdir $(kde_servicesdir) + +####### kdevelop will overwrite this part!!! (end)############ +# this 10 paths are KDE specific. Use them: +# kde_htmldir Where your docs should go to. (contains lang subdirs) +# kde_appsdir Where your application file (.kdelnk) should go to. +# kde_icondir Where your icon should go to. +# kde_minidir Where your mini icon should go to. +# kde_datadir Where you install application data. (Use a subdir) +# kde_locale Where translation files should go to.(contains lang subdirs) +# kde_cgidir Where cgi-bin executables should go to. +# kde_confdir Where config files should go to. +# kde_mimedir Where mimetypes should go to. +# kde_toolbardir Where general toolbar icons should go to. +# kde_wallpaperdir Where general wallpapers should go to. + +# set the include path for X, qt and KDE +INCLUDES= $(all_includes) + +METASOURCES = AUTO + +rcdir = $(kde_datadir)/kxmleditor +rc_DATA = kxmleditorpartBrowseUI.rc kxmleditorpartEditUI.rc kxedocument.rc + +messages: rc.cpp + LIST=`find . -name \*.h -o -name \*.hh -o -name \*.H -o -name \*.hxx -o -name \*.hpp -o -name \*.cpp -o -name \*.cc -o -name \*.cxx -o -name \*.ecpp -o -name \*.C`; \ + if test -n "$$LIST"; then \ + if ! test -e $(podir)/kxmleditor.pot; then touch $(podir)/kxmleditor.pot; fi; \ + $(XGETTEXT) -j $$LIST -o $(podir)/kxmleditor.pot; \ + fi + + +noinst_HEADERS = kxesearchdialog.h kxeprocinstrdialog.h kxespecprocinstrdialog.h kxeelementdialog.h kxeattributedialog.h kxechardatadialog.h kxechoosestringdialog.h kxefilenewdialog.h kxeconfiguration.h kxesettings.h kxetreeviewsettings.h kxenewfilesettings.h kxeprintsettings.h kxearchiveextssettings.h kxetextviewsettings.h kxe_treeviewitem.h kxe_treeview.h kxe_viewelement.h kxe_viewattributes.h kxesyntaxhighlighter.h kxetexteditordialog.h actions.h qdom_add.h kxecommand.h commands_file.h commands_edit.h commands_insert.h kxmleditorabout.h kxmleditorpart.h kxmleditorfactory.h dcopiface_part_ro.h kxedocument.h diff --git a/part/actions.cpp b/part/actions.cpp new file mode 100644 index 0000000..8b6abcb --- /dev/null +++ b/part/actions.cpp @@ -0,0 +1,229 @@ +/*************************************************************************** + actions.cpp - description + ------------------- + begin : Tue Jul 10 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "actions.h" + +// include files for QT + +#include +#include +#include +#include + +// include files for KDE +#include +#include +#include +#include + +//------------------------------------------------------------------- +// +// KXmlEditorComboAction member functions +// +//------------------------------------------------------------------- + +KXmlEditorComboAction::KXmlEditorComboAction(const QString& text, + int accel, + const QObject *receiver, + const char *member, + QObject* parent, + const char* name) + : KAction(text, accel, parent, name), + m_pCombo(0) +{ + m_receiver = receiver; + m_member = member; +} + +KXmlEditorComboAction::~KXmlEditorComboAction() +{ + //delete m_pCombo; // L.V. this cause crash !!! +} + +QComboBox* KXmlEditorComboAction::comboBox() +{ + return m_pCombo; +} + +int KXmlEditorComboAction::plug(QWidget *w, int index) +{ + // if ( !w->inherits( "KToolBar" ) ); + // return -1; + + KToolBar *toolBar = (KToolBar *) w; + + int id = KAction::getToolButtonID(); + //kdDebug() << "KXmlEditorComboAction::plug id=" << id << endl; + + m_pCombo = new QComboBox( toolBar, "Path Combo" ); + m_pCombo->setEditable(true); + m_pCombo->setInsertionPolicy(QComboBox::NoInsertion); + toolBar->insertWidget( id, 70, m_pCombo, index ); + connect( m_pCombo, SIGNAL(activated(const QString&)), m_receiver, m_member ); + + addContainer( toolBar, id ); + + connect(toolBar, SIGNAL(destroyed()), this, SLOT(slotDestroyed())); + + toolBar->setItemAutoSized(id, true); + + QWhatsThis::add( m_pCombo, whatsThis() ); + + return containerCount() - 1; +} + +void KXmlEditorComboAction::unplug(QWidget *w) +{ +// if ( !w->inherits( "KToolBar" ) ) +// return; + + KToolBar *toolBar = (KToolBar *)w; + + int idx = findContainer( w ); + //kdDebug() << "KXmlEditorComboAction::unplug idx=" << idx << " menuId=" << menuId(idx) << endl; + + toolBar->removeItem( menuId( idx ) ); + + removeContainer( idx ); + m_pCombo = 0; +} + +void KXmlEditorComboAction::slotClear() +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::slotClear] action not plugged" << endl; + return; + } + + m_pCombo->clear(); +} + +void KXmlEditorComboAction::slotClearEdit() +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::slotClearEdit] action not plugged" << endl; + return; + } + + m_pCombo->clearEdit(); +} + +void KXmlEditorComboAction::slotFocusEdit() +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::slotFocusEdit] action not plugged" << endl; + return; + } + + m_pCombo->setFocus(); +} + +QString KXmlEditorComboAction::currentText() const +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::currentText] action not plugged" << endl; + return QString::null; + } + + return m_pCombo->currentText(); +} + +const QPixmap * KXmlEditorComboAction::currentPixmap() const +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::currentPixmap] action not plugged" << endl; + return 0; + } + + return m_pCombo->pixmap( m_pCombo->currentItem() ); +} + +void KXmlEditorComboAction::insertItem( const QPixmap & pixmap, const QString & text ) +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::insertItem] action not plugged" << endl; + return; + } + + if ( text.isEmpty() ) + kdWarning() << "[KXmlEditorComboAction::insertItem] empty string as parameter" << endl; + + int nIndex = findItem(text); + if ( nIndex != -1 ) + m_pCombo->removeItem(nIndex); + + m_pCombo->insertItem( pixmap, text, 0 ); + m_pCombo->setCurrentItem(0); + + if ( m_pCombo->count() > 15 ) + m_pCombo->removeItem(15); +} + +void KXmlEditorComboAction::removeItem( const QString & text ) +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::removeItem] action not plugged" << endl; + return; + } + + int nIndex = findItem(text); + if ( nIndex == -1 ) + { + kdDebug() << "KXmlEditorComboAction::removeItem] item not found" << endl; + return; + } + + m_pCombo->removeItem(nIndex); +} + +int KXmlEditorComboAction::findItem( const QString & text ) +{ + if ( containerCount() == 0 ) + { + kdWarning() << "[KXmlEditorComboAction::findItem] action not plugged" << endl; + return -1; + } + + int nIndex = -1; + int i=0; + while ( ( i < m_pCombo->count() ) && ( nIndex == -1 ) ) + { + if ( m_pCombo->text(i) == text ) + nIndex = i; + i++; + } + + return nIndex; +} + +ToolbarLabel::ToolbarLabel( const QString& text ) + : QLabel( text, 0L, "kde toolbar widget" ) // Use this name for it to be styled! +// , m_mw(mw) +{ + setBackgroundMode( Qt::PaletteButton ); + setAlignment( (QApplication::reverseLayout() ? Qt::AlignRight : Qt::AlignLeft) | + Qt::AlignVCenter | Qt::ShowPrefix ); + adjustSize(); + } + diff --git a/part/actions.h b/part/actions.h new file mode 100644 index 0000000..43d0967 --- /dev/null +++ b/part/actions.h @@ -0,0 +1,88 @@ +/*************************************************************************** + actions.h - description + ------------------- + begin : Tue Jul 10 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef ACTIONS_H +#define ACTIONS_H + +#include +#include +class QComboBox; + +/** + *@author Lumir Vanek + */ + +class KXmlEditorComboAction : public KAction +{ + Q_OBJECT +public: + KXmlEditorComboAction(const QString& text, int accel, const QObject *receiver, const char *member, QObject* parent, const char* name); + ~KXmlEditorComboAction(); + + virtual int plug(QWidget *w, int index = -1); + + virtual void unplug(QWidget *w); + + /** Returns the text from the combobox' editline (@ref QComboBox::currentText). */ + QString currentText() const; + + /** Returns the current pixmap or 0, if there isn't any (see @ref QComboBox::pixmap). */ + const QPixmap * currentPixmap() const; + + /** + * Inserts the given item as the first. + * Deletes the old entry, if the item was already in the list. + */ + void insertItem( const QPixmap & pixmap, const QString & text ); + + /** Tries to remove the item with the given text. */ + void removeItem( const QString & text ); + + /** returns combo box */ + QComboBox *comboBox(); + +public slots: + /** Clears the whole combobox using @ref QComboBox::clear. */ + void slotClear(); + /** Clears the combobox' editline. */ + void slotClearEdit(); + /** Gives focus to the combobox' editline. */ + void slotFocusEdit(); + +protected: + /** + * Tries to find an item with the given text. If it finds it, + * the items id is returned, otherwise -1. + */ + virtual int findItem( const QString & text ); + +private: + const QObject *m_receiver; + const char *m_member; + QComboBox * m_pCombo; +}; + + +class ToolbarLabel : public QLabel +{ + Q_OBJECT +public: + ToolbarLabel( const QString & text ); +}; + + +#endif diff --git a/part/commands_edit.cpp b/part/commands_edit.cpp new file mode 100644 index 0000000..ba298b0 --- /dev/null +++ b/part/commands_edit.cpp @@ -0,0 +1,778 @@ +/*************************************************************************** + commands_edit - description + ------------------- + begin : Wed Nov 26 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : a_charytoniuk@user.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include "commands_edit.h" + +#include + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Cutting element to clipboard ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXECutCommand::KXECutCommand(KXEDocument *pDocument, QDomNode &domNode) + : KXEDeleteNodeCommand(pDocument, domNode) +{ +} + +KXECutCommand::~KXECutCommand() +{ +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Pasting node from clipboard to document ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEPasteToDocumentCommand::KXEPasteToDocumentCommand( + KXEDocument *pDocument, + QDomDocument *pDomTargetDoc, + QDomElement &domSourceElement + ) + : KXECommand(pDocument) +{ + if ( pDomTargetDoc == 0 ) + kdError() << "KXEPasteToDocumentCommand::KXEPasteToDocumentCommand the given XML document object is empty." << endl; + + m_pDomTargetDoc = pDomTargetDoc; + m_domSourceElement = domSourceElement; +} + +KXEPasteToDocumentCommand::~KXEPasteToDocumentCommand() +{ +} + +void KXEPasteToDocumentCommand::execute() +{ + // Insert root element + QDomNode newNode = m_pDomTargetDoc->importNode(m_domSourceElement, true); + m_pDomTargetDoc->appendChild(newNode); + m_pDocument->updateNodeCreated(newNode); +} + +void KXEPasteToDocumentCommand::unexecute() +{ + QDomNode removedNode = m_pDomTargetDoc->removeChild( m_pDomTargetDoc->documentElement()); + + if ( removedNode.isNull() ) + kdError() << "KXEPasteToDocumentCommand::unexecute error removing node." << endl; + else + { + m_pDocument->updateNodeDeleted(removedNode); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Pasting node from clipboard to element ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEPasteToElementCommand::KXEPasteToElementCommand( + KXEDocument *pDocument, + QDomElement & domTargetElement, + QDomNode &domSourceNode + ) + : KXECommand(pDocument) +{ + if ( domTargetElement.isNull() ) + kdError() << "KXEPasteCommand::KXEPasteCommand the given XML element object is empty." << endl; + + m_domTargetElement = domTargetElement; + m_domSourceNode = domSourceNode; +} + +KXEPasteToElementCommand::~KXEPasteToElementCommand() +{ +} + +void KXEPasteToElementCommand::execute() +{ + m_domTargetElement.appendChild(m_domSourceNode); + m_pDocument->updateNodeCreated(m_domSourceNode); +} + +void KXEPasteToElementCommand::unexecute() +{ + if ( m_domSourceNode.parentNode().removeChild( m_domSourceNode ).isNull() ) + kdError() << "KXEPasteToElementCommand::unexecute error removing the node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domSourceNode); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Pasting proc.instr from clipboard to proc.instr ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEPasteToProcInstrCommand::KXEPasteToProcInstrCommand( + KXEDocument *pDocument, + QDomProcessingInstruction &domTargetProcInstr, + QDomProcessingInstruction &domSourceProcInstr + ) + : KXECommand(pDocument) +{ + if ( domTargetProcInstr.isNull() ) + kdError() << "KXEPasteToProcInstrCommand::KXEPasteToProcInstrCommand the given object is empty." << endl; + + if ( domSourceProcInstr.isNull() ) + kdError() << "KXEPasteToProcInstrCommand::KXEPasteToProcInstrCommand the given object is empty." << endl; + + m_domTargetProcInstr = domTargetProcInstr; + m_strNewData = domSourceProcInstr.data(); +} + +KXEPasteToProcInstrCommand::~KXEPasteToProcInstrCommand() +{ +} + +void KXEPasteToProcInstrCommand::execute() +{ + // Replace contents of selected proc. instr. + m_strOldData = m_domTargetProcInstr.data(); + m_domTargetProcInstr.setData(m_strNewData); + m_pDocument->updateNodeChanged(m_domTargetProcInstr); +} + +void KXEPasteToProcInstrCommand::unexecute() +{ + // Rverse action. + m_domTargetProcInstr.setData(m_strOldData); + m_pDocument->updateNodeChanged(m_domTargetProcInstr); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Pasting char. data from clipboard to char. data ////////// +////////////////////////////////////////////////////////////////////////////////////////// + + +KXEPasteToCharDataCommand::KXEPasteToCharDataCommand( + KXEDocument *pDocument, + QDomCharacterData &domTargetCharData, + QDomCharacterData &domSourceCharData + ) + : KXECommand(pDocument) +{ + if ( domTargetCharData.isNull() ) + kdError() << "KXEPasteToCharDataCommand::KXEPasteToCharDataCommand the given object is empty." << endl; + + if ( domSourceCharData.isNull() ) + kdError() << "KXEPasteToCharDataCommand::KXEPasteToCharDataCommand the given object is empty." << endl; + + m_domTargetCharData = domTargetCharData; + m_strNewData = domSourceCharData.data(); +} + +KXEPasteToCharDataCommand::~KXEPasteToCharDataCommand() +{ +} + +void KXEPasteToCharDataCommand::execute() +{ + // replace target contents with source + m_strOldData = m_domTargetCharData.data(); + m_domTargetCharData.setData(m_strNewData); + m_pDocument->updateNodeChanged(m_domTargetCharData); +} + +void KXEPasteToCharDataCommand::unexecute() +{ + m_domTargetCharData.setData(m_strOldData); + m_pDocument->updateNodeChanged(m_domTargetCharData); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Drag & drop node ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEDragDropMoveCommand::KXEDragDropMoveCommand( + KXEDocument *pDocument, + QDomElement & domTargetElement, + QDomNode &domSourceNode + ) + : KXECommand(pDocument) +{ + if ( domTargetElement.isNull() ) + kdError() << "KXEDragDropMoveCommand::KXEDragDropMoveCommand the given XML element object is empty." << endl; + + m_domTargetElement = domTargetElement; + m_domSourceNode = domSourceNode; + m_domPreviousParentNode = m_domSourceNode.parentNode(); +} + +KXEDragDropMoveCommand::~KXEDragDropMoveCommand() +{ +} + +void KXEDragDropMoveCommand::execute() +{ + // 1st, remove source node from its parent + if( m_domPreviousParentNode.removeChild( m_domSourceNode ).isNull() ) + kdError() << "KXEDocument::slotXmlElementDelete error removing the selected node." << endl; + else + m_pDocument->updateNodeDeleted(m_domSourceNode); + + // 2nd, append moved node to new parent + m_domTargetElement.appendChild(m_domSourceNode); + m_pDocument->updateNodeCreated(m_domSourceNode); +} + +void KXEDragDropMoveCommand::unexecute() +{ + // 1st, remove source node from its parent + if ( m_domTargetElement.removeChild( m_domSourceNode ).isNull() ) + kdError() << "KXEPasteToElementCommand::unexecute error removing the node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domSourceNode); + } + + // 2nd, append moved node to previous parent + m_domPreviousParentNode.appendChild(m_domSourceNode); + m_pDocument->updateNodeCreated(m_domSourceNode); +} + + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Deleting node ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEDeleteNodeCommand::KXEDeleteNodeCommand(KXEDocument *pDocument, QDomNode &domNode) + : KXECommand(pDocument) +{ + m_domNode = domNode; + m_domParentNode = m_domNode.parentNode(); + m_afterNode = m_domNode.previousSibling(); + + if ( m_domParentNode.isNull() ) + kdError() << "KXEDeleteNodeCommand::KXEDeleteNodeCommand selected nodes parent node is empty." << endl; +} + +KXEDeleteNodeCommand::~KXEDeleteNodeCommand() +{ +} + +void KXEDeleteNodeCommand::execute() +{ + if ( m_domParentNode.removeChild( m_domNode ).isNull() ) + kdError() << "KXEDeleteNodeCommand::execute error removing the selected node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domNode); + } +} + +void KXEDeleteNodeCommand::unexecute() +{ + if (m_afterNode.isNull()) + m_domParentNode.insertBefore(m_domNode,m_afterNode); + else + m_domParentNode.insertAfter( m_domNode,m_afterNode ); + m_pDocument->updateNodeCreated(m_domNode); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Deleting one attribute ////////// +////////////////////////////////////////////////////////////////////////////////////////// + + +KXEDeleteAttrCommand::KXEDeleteAttrCommand( + KXEDocument *pDocument, + QDomElement &domOwnerElement, + QDomAttr &domAttr + ) + : KXECommand(pDocument) +{ + m_domOwnerElement = domOwnerElement; + m_domAttr = domAttr; +} + +KXEDeleteAttrCommand::~KXEDeleteAttrCommand() +{ +} + +void KXEDeleteAttrCommand::execute() +{ + m_domOwnerElement.removeAttributeNode(m_domAttr); + m_pDocument->updateNodeChanged(m_domOwnerElement); +} + +void KXEDeleteAttrCommand::unexecute() +{ + m_domOwnerElement.setAttributeNode( m_domAttr ); + m_pDocument->updateNodeChanged( m_domOwnerElement ) ; +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Deleting all attributes ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEDeleteAllAttribCommand::KXEDeleteAllAttribCommand( + KXEDocument *pDocument, + QDomElement &domOwnerElement + ) + : KXECommand(pDocument) +{ + m_domOwnerElement = domOwnerElement; + m_listRemovedAttributes.setAutoDelete( true ); // the list owns the objects +} + +KXEDeleteAllAttribCommand::~KXEDeleteAllAttribCommand() +{ +} + +void KXEDeleteAllAttribCommand::execute() +{ + QDomNamedNodeMap mapAttributes = m_domOwnerElement.attributes(); + uint nAttributes = mapAttributes.count(); + + if( nAttributes == 0 ) + return; + + for( uint nRow = nAttributes; nRow > 0; nRow-- ) + { + QDomNode node = mapAttributes.item(nRow-1); + if ( node.isAttr() ) + { QDomAttr domAttr = node.toAttr(); + + QDomAttr *pNodeCloned = new QDomAttr(domAttr.cloneNode(true).toAttr()); + + m_listRemovedAttributes.append(pNodeCloned); + m_domOwnerElement.removeAttributeNode(node.toAttr()); + } + else + kdDebug() << "KXMLEditor " << k_funcinfo << " node is not an attribute (but should be)" << node.nodeName() << endl; + } + + m_pDocument->updateNodeChanged(m_domOwnerElement); +} + +void KXEDeleteAllAttribCommand::unexecute() +{ + QDomNamedNodeMap mapAttributes = m_domOwnerElement.attributes(); + uint nAttributes = m_listRemovedAttributes.count(); + + if ( nAttributes == 0 ) + return; + + QDomAttr *pDomAttr; + for ( pDomAttr = m_listRemovedAttributes.first(); pDomAttr; pDomAttr = m_listRemovedAttributes.next() ) + { + if(!pDomAttr->namespaceURI().isEmpty()) + m_domOwnerElement.setAttribute(pDomAttr->name(), pDomAttr->value()); + else + m_domOwnerElement.setAttributeNS(pDomAttr->namespaceURI(), pDomAttr->name(), pDomAttr->value()); + } + + m_listRemovedAttributes.clear(); + + m_pDocument->updateNodeChanged(m_domOwnerElement); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Moving node up ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEUpCommand::KXEUpCommand(KXEDocument *pDocument, QDomNode &domNode) + : KXECommand(pDocument) +{ + m_domNode = domNode; + m_domParentNode = m_domNode.parentNode(); + + if ( m_domParentNode.isNull() ) + kdError() << "KXEUpCommand::KXEUpCommand selected nodes parent node is empty." << endl; +} + +KXEUpCommand::~KXEUpCommand() +{ +} + +void KXEUpCommand::execute() +{ + QDomNode domPrevSibling = m_domNode.previousSibling(); + if ( domPrevSibling.isNull() ) + { + kdError() << "KXEUpCommand::execute selected node doesn't seem to have a previous sibling." << endl; + return; + } + + QDomNode domNode = m_domParentNode.removeChild( m_domNode ); + if ( domNode.isNull() ) + kdError() << "KXEUpCommand::execute can't remove child node." << endl; + else + { + domNode = m_domParentNode.insertBefore( domNode, domPrevSibling ); + if ( domNode.isNull() ) + kdError() << "KXEUpCommand::execute can't insert child node." << endl; + else + { + m_pDocument->updateNodeMoved(domNode); + } + } +} + +void KXEUpCommand::unexecute() +{ + QDomNode domNextSibling = m_domNode.nextSibling(); + if ( domNextSibling.isNull() ) + { + kdError() << "KXEUpCommand::unexecute selected node doesn't seem to have a next sibling." << endl; + return; + } + + QDomNode domNode = m_domParentNode.removeChild( m_domNode ); + if ( domNode.isNull() ) + kdError() << "KXEUpCommand::unexecute can't remove child node." << endl; + else + { + domNode = m_domParentNode.insertAfter( domNode, domNextSibling ); + if ( domNode.isNull() ) + kdError() << "KXEUpCommand::unexecute can't insert child node." << endl; + else + { + m_pDocument->updateNodeMoved(domNode); + } + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Moving node down ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEDownCommand::KXEDownCommand(KXEDocument *pDocument, QDomNode &domNode) + : KXECommand(pDocument) +{ + m_domNode = domNode; + m_domParentNode = m_domNode.parentNode(); + + if ( m_domParentNode.isNull() ) + kdError() << "KXEDownCommand::KXEDownCommand selected nodes parent node is empty." << endl; +} + +KXEDownCommand::~KXEDownCommand() +{ +} + +void KXEDownCommand::execute() +{ + QDomNode domNextSibling = m_domNode.nextSibling(); + if ( domNextSibling.isNull() ) + { + kdError() << "KXEDownCommand::execute selected node doesn't seem to have a next sibling." << endl; + return; + } + + QDomNode domNode = m_domParentNode.removeChild( m_domNode ); + if ( domNode.isNull() ) + kdError() << "KXEDownCommand::execute can't remove child node." << endl; + else + { + domNode = m_domParentNode.insertAfter( domNode, domNextSibling ); + if ( domNode.isNull() ) + kdError() << "KXEDownCommand::execute can't insert child node." << endl; + else + { + m_pDocument->updateNodeMoved(domNode); + } + } +} + +void KXEDownCommand::unexecute() +{ + QDomNode domPrevSibling = m_domNode.previousSibling(); + if ( domPrevSibling.isNull() ) + { + kdError() << "KXEDownCommand::unexecute selected node doesn't seem to have a previous sibling." << endl; + return; + } + + QDomNode domNode = m_domParentNode.removeChild( m_domNode ); + if ( domNode.isNull() ) + kdError() << "KXEDownCommand::unexecute can't remove child node." << endl; + else + { + domNode = m_domParentNode.insertBefore( domNode, domPrevSibling ); + if ( domNode.isNull() ) + kdError() << "KXEDownCommand::unexecute can't insert child node." << endl; + else + { + m_pDocument->updateNodeMoved(domNode); + } + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Editing char. data properties ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEEditCharDataCommand::KXEEditCharDataCommand( + KXEDocument *pDocument, + QDomCharacterData &domCharacterData, + const QString strNewContents + ) + : KXECommand(pDocument) +{ + m_domCharacterData = domCharacterData; + m_strNewContents = strNewContents; +} + +KXEEditCharDataCommand::~KXEEditCharDataCommand() +{ +} + +void KXEEditCharDataCommand::execute() +{ + m_strOldContents = m_domCharacterData.data(); + m_domCharacterData.setData( m_strNewContents ); + m_pDocument->updateNodeChanged( m_domCharacterData ); +} + +void KXEEditCharDataCommand::unexecute() +{ + m_domCharacterData.setData( m_strOldContents ); + m_pDocument->updateNodeChanged( m_domCharacterData ); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Editing proc. instr properties ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEEditProcInstrCommand::KXEEditProcInstrCommand( + KXEDocument *pDocument, + QDomProcessingInstruction &domProcInstr, + const QString strNewData + ) + : KXECommand(pDocument) +{ + m_domProcInstr = domProcInstr; + m_strNewData = strNewData; +} + +KXEEditProcInstrCommand::~KXEEditProcInstrCommand() +{ +} + +void KXEEditProcInstrCommand::execute() +{ + m_strOldData = m_domProcInstr.data(); + m_domProcInstr.setData( m_strNewData ); + m_pDocument->updateNodeChanged( m_domProcInstr ); +} + +void KXEEditProcInstrCommand::unexecute() +{ + m_domProcInstr.setData( m_strOldData ); + m_pDocument->updateNodeChanged( m_domProcInstr ); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Editing element data properties ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEEditElementCommand::KXEEditElementCommand( + KXEDocument *pDocument, + QDomElement &domElement, + const QString strNewPrefix, + const QString strNewName + ) + : KXECommand(pDocument) +{ + m_domElement = domElement; + m_strNewPrefix = strNewPrefix; + m_strNewName = strNewName; +} + +KXEEditElementCommand::~KXEEditElementCommand() +{ +} + +void KXEEditElementCommand::execute() +{ + m_strOldPrefix = m_domElement.prefix(); + m_strOldName = m_domElement.tagName(); + + + if ( ! m_domElement.namespaceURI().isNull() ) + m_domElement.setPrefix( m_strNewPrefix ); + + m_domElement.setTagName( m_strNewName ); + + m_pDocument->updateNodeChanged( m_domElement ); +} + +void KXEEditElementCommand::unexecute() +{ + if ( ! m_domElement.namespaceURI().isNull() ) + m_domElement.setPrefix( m_strOldPrefix ); + + m_domElement.setTagName( m_strOldName ); + + m_pDocument->updateNodeChanged( m_domElement ); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Edit attribute value ////////// +////////////////////////////////////////////////////////////////////////////////////////// + + +KXEEditAttrValueCommand::KXEEditAttrValueCommand( + KXEDocument *pDocument, + const QDomAttr &domAttr, + const QString strNewValue + ) + : KXECommand(pDocument) +{ + m_domAttr = domAttr; + m_strNewValue = strNewValue; +} + +KXEEditAttrValueCommand::~KXEEditAttrValueCommand() +{ +} + +void KXEEditAttrValueCommand::execute() +{ + m_strOldValue = m_domAttr.value(); + m_domAttr.setValue( m_strNewValue ); + + m_pDocument->updateNodeChanged(m_domAttr.ownerElement()); +} + +void KXEEditAttrValueCommand::unexecute() +{ + m_domAttr.setValue( m_strOldValue ); + + m_pDocument->updateNodeChanged(m_domAttr.ownerElement()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Edit attribute name ////////// +////////////////////////////////////////////////////////////////////////////////////////// + + +KXEEditAttrNameCommand::KXEEditAttrNameCommand( + KXEDocument *pDocument, + const QDomAttr &domOldAttr, + const QString strNewName + ) + : KXECommand(pDocument) +{ + m_strNewName = strNewName; + m_strOldName = domOldAttr.name(); + m_strValue = domOldAttr.value(); + + if(!domOldAttr.namespaceURI().isEmpty()) + m_strNamespaceURI = domOldAttr.namespaceURI(); + + m_domOwnerElement = domOldAttr.ownerElement(); +} + +KXEEditAttrNameCommand::~KXEEditAttrNameCommand() +{ +} + +void KXEEditAttrNameCommand::execute() +{ + // it's not possible to change name. Must delete attribute and create new one + if(m_strNamespaceURI.isEmpty()) + { + m_domOwnerElement.setAttribute(m_strNewName, m_strValue); + m_domOwnerElement.attributes().removeNamedItem(m_strOldName); + } + else + { + m_domOwnerElement.setAttributeNS( m_strNamespaceURI, m_strNewName, m_strValue); + m_domOwnerElement.attributes().removeNamedItemNS (m_strNamespaceURI, m_strOldName); + } + + m_pDocument->updateNodeChanged(m_domOwnerElement); +} + +void KXEEditAttrNameCommand::unexecute() +{ + // it's not possible to change name. Must delete attribute and create new one + if(m_strNamespaceURI.isEmpty()) + { + m_domOwnerElement.setAttribute(m_strOldName, m_strValue); + m_domOwnerElement.attributes().removeNamedItem(m_strNewName); + + } + else + { + m_domOwnerElement.setAttributeNS( m_strNamespaceURI, m_strOldName, m_strValue); + m_domOwnerElement.attributes().removeNamedItemNS (m_strNamespaceURI, m_strNewName); + } + + m_pDocument->updateNodeChanged(m_domOwnerElement); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Editing element and its subtree as raw XML ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEEditRawXmlCommand::KXEEditRawXmlCommand( + KXEDocument *pDocument, + QDomElement &domOldElement, + QDomElement &domNewElement + ) + : KXECommand(pDocument) +{ + m_domOldElement = domOldElement; + m_domNewElement = domNewElement; + m_domParentNode = domOldElement.parentNode(); + m_afterNode = domOldElement.previousSibling(); + + if ( m_domParentNode.isNull() ) + kdError() << "KXEEditRawXmlCommand::KXEEditRawXmlCommand selected nodes parent node is empty." << endl; + +} + +KXEEditRawXmlCommand::~KXEEditRawXmlCommand() +{ +} + +void KXEEditRawXmlCommand::execute() +{ + // first delete node + if ( m_domParentNode.removeChild( m_domOldElement ).isNull() ) + kdError() << "KXEEditRawXmlCommand::execute error removing the selected node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domOldElement); + } + + // then insert new node + if (m_afterNode.isNull()) + m_domParentNode.insertBefore(m_domNewElement, m_afterNode); + else + m_domParentNode.insertAfter( m_domNewElement, m_afterNode ); + m_pDocument->updateNodeCreated(m_domNewElement); +} + +void KXEEditRawXmlCommand::unexecute() +{ + // first delete node + if ( m_domParentNode.removeChild( m_domNewElement ).isNull() ) + kdError() << "KXEEditRawXmlCommand::unexecute error removing the selected node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domNewElement); + } + + // then insert new node + if (m_afterNode.isNull()) + m_domParentNode.insertBefore(m_domOldElement, m_afterNode); + else + m_domParentNode.insertAfter( m_domOldElement, m_afterNode ); + m_pDocument->updateNodeCreated(m_domOldElement); +} diff --git a/part/commands_edit.h b/part/commands_edit.h new file mode 100644 index 0000000..c713861 --- /dev/null +++ b/part/commands_edit.h @@ -0,0 +1,346 @@ +/*************************************************************************** + commands_edit - description + ------------------- + begin : Wed Nov 26 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : a_charytoniuk@user.sourceforge.net + ***************************************************************************/ + + /*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef COMMANDS_EDIT_H +#define COMMANDS_EDIT_H + +#include "kxecommand.h" + +#include + +#include + +/** +@file +@author The KXMLEditor Team +*/ + +/** + @brief Command for removing any kind of nodes. +*/ +class KXEDeleteNodeCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEDeleteNodeCommand(KXEDocument*, QDomNode &); + /** @brief Destructor */ + ~KXEDeleteNodeCommand(); + /** @brief Performs node removal.*/ + virtual void execute(); + /** @brief Node removal rollback.*/ + virtual void unexecute(); + virtual QString name() const { return i18n("Delete node"); } + protected: + /** @short Stores infromation about parent node of the node to be deleted. */ + QDomNode m_domParentNode; + /** @short Stores infromation the node to be deleted. */ + QDomNode m_domNode; + /** @short Stores infromation about sibling node of the node to be deleted. */ + QDomNode m_afterNode; +}; +/** + @short Command for removing element attributes. +*/ +class KXEDeleteAttrCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEDeleteAttrCommand(KXEDocument*, QDomElement &, QDomAttr &); + /** @brief Destructor */ + ~KXEDeleteAttrCommand(); + /** @brief Preforms attributte removal. */ + virtual void execute(); + /** @brief Attributte removal rollback. */ + virtual void unexecute(); + virtual QString name() const { return i18n("Delete attribute"); } + protected: + /** @brief Stores attribute owner. */ + QDomElement m_domOwnerElement; + /** @brief Attribute about to be removed. */ + QDomAttr m_domAttr; +}; + +/** + @short Command for removing all element attributes. +*/ +class KXEDeleteAllAttribCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEDeleteAllAttribCommand(KXEDocument*, QDomElement &); + /** @brief Destructor */ + ~KXEDeleteAllAttribCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Delete all attributes"); } + protected: + QDomElement m_domOwnerElement; + QPtrList m_listRemovedAttributes; +}; + +/** + @short Command for cutting element to clipboard. +*/ +class KXECutCommand : public KXEDeleteNodeCommand +{ + public: + /** @brief Constructor */ + KXECutCommand(KXEDocument*, QDomNode &); + /** @brief Destructor */ + ~KXECutCommand(); + virtual QString name() const { return i18n("Cut node"); } +}; + +/** + @short Command for pasting to document from clipboard. +*/ +class KXEPasteToDocumentCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEPasteToDocumentCommand(KXEDocument*, QDomDocument *, QDomElement &); + /** @brief Destructor */ + ~KXEPasteToDocumentCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Paste node to document"); } + protected: + QDomDocument * m_pDomTargetDoc; + QDomElement m_domSourceElement; +}; + +/** + @short Command for pasting element from clipboard. +*/ +class KXEPasteToElementCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEPasteToElementCommand(KXEDocument*, QDomElement &, QDomNode &); + /** @brief Destructor */ + ~KXEPasteToElementCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Paste node to element"); } + protected: + QDomElement m_domTargetElement; + QDomNode m_domSourceNode; +}; + +class KXEPasteToProcInstrCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEPasteToProcInstrCommand(KXEDocument*, QDomProcessingInstruction &, QDomProcessingInstruction &); + /** @brief Destructor */ + ~KXEPasteToProcInstrCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Paste node to proc. instruction"); } + protected: + QDomProcessingInstruction m_domTargetProcInstr; + QString m_strNewData; + QString m_strOldData; +}; + +class KXEPasteToCharDataCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEPasteToCharDataCommand(KXEDocument*, QDomCharacterData &, QDomCharacterData &); + /** @brief Destructor */ + ~KXEPasteToCharDataCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Paste node to char. data"); } + protected: + QDomCharacterData m_domTargetCharData; + QString m_strNewData; + QString m_strOldData; +}; + +/** + @short Command for Drag & Drop. +*/ +class KXEDragDropMoveCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEDragDropMoveCommand(KXEDocument*, QDomElement &, QDomNode &); + /** @brief Destructor */ + ~KXEDragDropMoveCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Drag&&drop node"); } + protected: + QDomElement m_domTargetElement; + QDomNode m_domSourceNode; + QDomNode m_domPreviousParentNode; +}; + +/** + @short Command for moving selected node up. +*/ +class KXEUpCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEUpCommand(KXEDocument*, QDomNode &); + /** @brief Destructor */ + ~KXEUpCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Move node up"); } + protected: + QDomNode m_domParentNode; + QDomNode m_domNode; +}; + +/** + @short Command for moving selected node down. +*/ +class KXEDownCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEDownCommand(KXEDocument*, QDomNode &); + /** @brief Destructor */ + ~KXEDownCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Move node down"); } + protected: + QDomNode m_domParentNode; + QDomNode m_domNode; +}; + +class KXEEditCharDataCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEEditCharDataCommand(KXEDocument*, QDomCharacterData &, const QString); + /** @brief Destructor */ + ~KXEEditCharDataCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Editing character data"); } + protected: + QDomCharacterData m_domCharacterData; + QString m_strNewContents; + QString m_strOldContents; +}; + +/** + @short Command for editing selected processing instruction. +*/ +class KXEEditProcInstrCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEEditProcInstrCommand(KXEDocument*, QDomProcessingInstruction &, const QString); + /** @brief Destructor */ + ~KXEEditProcInstrCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Editing proc. instruction"); } + protected: + QDomProcessingInstruction m_domProcInstr; + QString m_strNewData; + QString m_strOldData; +}; + +/** + @short Command for editing selected XML element. +*/ +class KXEEditElementCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEEditElementCommand(KXEDocument*, QDomElement &, const QString, const QString); + /** @brief Destructor */ + ~KXEEditElementCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Editing element"); } + protected: + QDomElement m_domElement; + QString m_strNewPrefix; + QString m_strNewName; + QString m_strOldPrefix; + QString m_strOldName; +}; + +/** + @short Command for editing element attribute value. +*/ +class KXEEditAttrValueCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEEditAttrValueCommand(KXEDocument*, const QDomAttr &, const QString); + /** @brief Destructor */ + ~KXEEditAttrValueCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Edit attribute value"); } + protected: + QDomAttr m_domAttr; + QString m_strNewValue; + QString m_strOldValue; +}; + +/** + @short Command for editing element attribute names. +*/ +class KXEEditAttrNameCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEEditAttrNameCommand(KXEDocument*, const QDomAttr &, const QString); + /** @brief Destructor */ + ~KXEEditAttrNameCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Edit attribute name"); } + protected: + QDomElement m_domOwnerElement; + QString m_strNewName; + QString m_strOldName; + QString m_strValue; + QString m_strNamespaceURI; +}; + +/** + @short Command for editing XML element as text. +*/ +class KXEEditRawXmlCommand : public KXECommand +{ + public: + /** @brief Constructor */ + KXEEditRawXmlCommand(KXEDocument*, QDomElement &, QDomElement &); + /** @brief Destructor */ + ~KXEEditRawXmlCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Editing raw XML"); } + protected: + QDomElement m_domOldElement; + QDomNode m_domParentNode; + QDomElement m_domNewElement; + QDomNode m_afterNode; +}; + +#endif diff --git a/part/commands_file.cpp b/part/commands_file.cpp new file mode 100644 index 0000000..f30ff2d --- /dev/null +++ b/part/commands_file.cpp @@ -0,0 +1,158 @@ +/*************************************************************************** + commands_file - description + ------------------- + begin : Wed Nov 26 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : a_charytoniuk@user.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include "commands_file.h" +#include +#include +#include +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Setting Version & Encoding ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEVersionEncodingCommand::KXEVersionEncodingCommand(KXEDocument* pDocument, const QString& oldData, const QString &newData) + : KXECommand(pDocument) +{ + m_strOldData = oldData; + m_strNewData = newData; +} + +KXEVersionEncodingCommand::~KXEVersionEncodingCommand() +{ +} + +void KXEVersionEncodingCommand::execute() +{ + m_pDocument->setSpecProcInstr("xml",m_strNewData); +} + +void KXEVersionEncodingCommand::unexecute() +{ + m_pDocument->setSpecProcInstr("xml",m_strOldData); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Attaching stylesheet ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEStylesheetAttachCommand::KXEStylesheetAttachCommand(KXEDocument* pDocument,const QString& prevStylesheet,const QString& newStylesheet) + : KXECommand(pDocument) +{ + m_strNewStylesheet = newStylesheet; + m_strPrevStylesheet = prevStylesheet; +} + +KXEStylesheetAttachCommand::~KXEStylesheetAttachCommand() +{ +} + +void KXEStylesheetAttachCommand::execute() +{ + m_pDocument->detachStylesheet(); + m_pDocument->attachStylesheet(KURL(m_strNewStylesheet)); +} + +void KXEStylesheetAttachCommand::unexecute() +{ + m_pDocument->detachStylesheet(); + if(!m_strPrevStylesheet.isEmpty()) + m_pDocument->attachStylesheet(KURL(m_strPrevStylesheet)); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Detaching Stylesheet ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEStylesheetDetachCommand::KXEStylesheetDetachCommand(KXEDocument* pDocument,const QString& prevStylesheet) + : KXECommand(pDocument) +{ + m_strPrevStylesheet = prevStylesheet; +} + +KXEStylesheetDetachCommand::~KXEStylesheetDetachCommand() +{ +} + +void KXEStylesheetDetachCommand::execute() +{ + m_pDocument->detachStylesheet(); +} + +void KXEStylesheetDetachCommand::unexecute() +{ + if (!m_strPrevStylesheet.isEmpty()) + m_pDocument->attachStylesheet(KURL(m_strPrevStylesheet)); +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Attaching Schema ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXESchemaAttachCommand::KXESchemaAttachCommand(KXEDocument *pDocument,const QString& newSchema) + : KXECommand(pDocument) +{ + m_pDocument = pDocument; + m_strNewSchema = newSchema; + m_strPrevSchema = ""; +} +KXESchemaAttachCommand::KXESchemaAttachCommand(KXEDocument *pDocument,const QString& newSchema,const QString& prevSchema) + : KXECommand(pDocument) +{ + m_strNewSchema = newSchema; + m_strPrevSchema = prevSchema; +} + +KXESchemaAttachCommand::~KXESchemaAttachCommand() +{ +} + +void KXESchemaAttachCommand::execute() +{ + m_pDocument->detachSchema(); // old schema is removed + m_pDocument->attachSchema(KURL(m_strNewSchema)); // new schema is applited +} + +void KXESchemaAttachCommand::unexecute() +{ + m_pDocument->detachSchema(); // new schema is removed + if (!m_strPrevSchema.isEmpty()) + m_pDocument->attachSchema(KURL(m_strPrevSchema)); // old schema is applied +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Detaching schema ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXESchemaDetachCommand::KXESchemaDetachCommand(KXEDocument* pDocument, const QString& schema) + : KXECommand(pDocument) +{ + m_schema = schema; +} + +KXESchemaDetachCommand::~KXESchemaDetachCommand() +{ +} + +void KXESchemaDetachCommand::execute() +{ + m_pDocument->detachSchema(); +} + +void KXESchemaDetachCommand::unexecute() +{ + if (!m_schema.isEmpty()) + m_pDocument->attachSchema(KURL(m_schema)); +} + diff --git a/part/commands_file.h b/part/commands_file.h new file mode 100644 index 0000000..00dc484 --- /dev/null +++ b/part/commands_file.h @@ -0,0 +1,102 @@ +/*************************************************************************** + commands_file - description + ------------------- + begin : Wed Nov 26 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : a_charytoniuk@user.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef COMMANDS_FILE_H +#define COMMANDS_FILE_H + +#include "kxecommand.h" +#include + +/** @file + This file contains all commands taken from menu File which + can effect our edited document. These commans allows to have + undo/redo functionality. +*/ + +/** +Command for setting version and encoding to XML file. + +@author The KXMLEditor Team +*/ + +class KXEDocument; +class QString; + +class KXEVersionEncodingCommand : public KXECommand +{ + public: + KXEVersionEncodingCommand(KXEDocument* pDocument, const QString& oldData, const QString &newData); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Changing version and encoding"); } + ~KXEVersionEncodingCommand(); + protected: + QString m_strOldData; + QString m_strNewData; +}; + +class KXEStylesheetAttachCommand : public KXECommand +{ + public: + KXEStylesheetAttachCommand(KXEDocument* pDocument,const QString& prevStylesheet,const QString& newStylesheet); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Attaching stylesheet ")+m_strNewStylesheet; } + ~KXEStylesheetAttachCommand(); + protected: + QString m_strPrevStylesheet; + QString m_strNewStylesheet; +}; + +class KXEStylesheetDetachCommand : public KXECommand +{ + public: + KXEStylesheetDetachCommand(KXEDocument* pDocument,const QString& prevStylesheet); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Detaching stylesheet ")+m_strPrevStylesheet; } + ~KXEStylesheetDetachCommand(); + protected: + QString m_strPrevStylesheet; +}; + +class KXESchemaAttachCommand : public KXECommand +{ + public: + KXESchemaAttachCommand(KXEDocument *pDocument,const QString& newSchema); + KXESchemaAttachCommand(KXEDocument *pDocument,const QString& newSchema, const QString& prevSchema); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Attaching schema ")+m_strNewSchema; } + ~KXESchemaAttachCommand(); + protected: + QString m_strNewSchema; + QString m_strPrevSchema; +}; + +class KXESchemaDetachCommand : public KXECommand +{ + public: + KXESchemaDetachCommand(KXEDocument* pDocument, const QString& schema); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Detaching schema ")+m_schema; } + ~KXESchemaDetachCommand(); + protected: + QString m_schema; +}; + +#endif diff --git a/part/commands_insert.cpp b/part/commands_insert.cpp new file mode 100644 index 0000000..9f17d51 --- /dev/null +++ b/part/commands_insert.cpp @@ -0,0 +1,329 @@ +/*************************************************************************** + commands_insert - description + ------------------- + begin : Wed Nov 26 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : lvanek@user.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include "commands_insert.h" + +#include + +#include + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Inserting new XML element ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEElementCommand::KXEElementCommand( + KXEDocument *pDocument, + QDomDocument * pDomDoc, + QString strNsURI, + QString strPrefix, + QString strName + ) + : KXECommand(pDocument) +{ + if ( pDomDoc == 0 ) + kdError() << "KXEElementCommand::KXEElementCommand the given XML document object is empty." << endl; + + m_pDomDoc = pDomDoc; + + if ( strNsURI.isEmpty() ) + m_domElement = m_pDomDoc->createElement( strName ); + else + m_domElement = m_pDomDoc->createElementNS( strNsURI, strPrefix + ":" + strName ); +} + +KXEElementCommand::KXEElementCommand( + KXEDocument *pDocument, + QDomElement & domParentElement, + QString strNsURI, + QString strPrefix, + QString strName, + bool bAtTop + ) + : KXECommand(pDocument) +{ + if ( domParentElement.isNull() ) + kdError() << "KXEElementCommand::KXEElementCommand the given XML element object is empty." << endl; + + m_domParentElement = domParentElement; + m_pDomDoc = 0; + m_bAtTop = bAtTop; + + if ( strNsURI.isEmpty() ) + m_domElement = m_domParentElement.ownerDocument().createElement( strName ); + else + m_domElement = m_domParentElement.ownerDocument().createElementNS( strNsURI, strPrefix + ":" + strName ); +} + +KXEElementCommand::~KXEElementCommand() +{ +} + +void KXEElementCommand::execute() +{ + if ( m_pDomDoc ) + { + // Insert root element + m_pDomDoc->appendChild( m_domElement ); + } + else + { + if( !m_domParentElement.isNull() ) + { + // Insert child element + if ( m_bAtTop ) + { // insert as first child + QDomNode domFirstChildNode = m_domParentElement.firstChild(); + if ( domFirstChildNode.isNull() ) + m_domParentElement.appendChild( m_domElement ); // no childs yet -> simply append + else + m_domParentElement.insertBefore( m_domElement, domFirstChildNode ); + } + else // insert as last child + m_domParentElement.appendChild( m_domElement ); + } + else + { + kdError() << "KXEElementCommand::execute document and element object is empty." << endl; + } + } + m_pDocument->updateNodeCreated(m_domElement); +} + +void KXEElementCommand::unexecute() +{ + if ( m_domElement.parentNode().removeChild( m_domElement ).isNull() ) + kdError() << "KXEElementCommand::unexecute error removing the selected node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domElement); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// inserting new attribute ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEAttributeCommand::KXEAttributeCommand( + KXEDocument *pDocument, + QDomElement &domOwnerElement, + QString strNamespace, + QString strQName, + QString strValue + ) + : KXECommand(pDocument) +{ + if ( domOwnerElement.isNull() ) + { + kdError() << k_funcinfo << "KXEAttributeCommand::KXEAttributeCommand - The given owner element is empty." << endl; + return; + } + + m_domOwnerElement = domOwnerElement; + m_strNamespace = strNamespace; + m_strQName = strQName; + m_strValue = strValue; +} + +KXEAttributeCommand::~KXEAttributeCommand() +{ +} + +void KXEAttributeCommand::execute() +{ + if ( m_strNamespace.isEmpty() ) + m_domOwnerElement.setAttribute( m_strQName, m_strValue ); + else + m_domOwnerElement.setAttributeNS( m_strNamespace, m_strQName, m_strValue ); + + m_pDocument->updateNodeChanged( m_domOwnerElement ) ; +} + +void KXEAttributeCommand::unexecute() +{ + if ( m_strNamespace.isEmpty() ) + m_domOwnerElement.removeAttribute(m_strQName); + else + m_domOwnerElement.removeAttributeNS(m_strNamespace, m_strQName); + + m_pDocument->updateNodeChanged( m_domOwnerElement ) ; +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Inserting new character data ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXECharDataCommand::KXECharDataCommand( + KXEDocument *pDocument, + QDomElement & domParentElement, + bool bAtTop, + CharDataKind eCharDataKind, + QString strContents + ) + : KXECommand(pDocument) +{ + if ( domParentElement.isNull() ) + { + kdError() << k_funcinfo << "KXECharDataCommand::KXECharDataCommand - The given parent object is empty." << endl; + return; + } + + m_domParentElement = domParentElement; + m_bAtTop = bAtTop; + + switch ( eCharDataKind ) + { + case CharDataTextNode: + m_domCharData = domParentElement.ownerDocument().createTextNode( strContents ); + break; + + case CharDataCDATASection: + m_domCharData = domParentElement.ownerDocument().createCDATASection( strContents ); + break; + + case CharDataComment: + m_domCharData = domParentElement.ownerDocument().createComment( strContents ); + break; + + default: + kdError() << "KXECharDataCommand::KXECharDataCommand unrecognized char. data type." << endl; + break; + } +} + +KXECharDataCommand::~KXECharDataCommand() +{ +} + +void KXECharDataCommand::execute() +{ + if ( m_bAtTop ) + { // insert as first child + QDomNode domFirstChildNode = m_domParentElement.firstChild(); + if ( domFirstChildNode.isNull() ) + m_domParentElement.appendChild( m_domCharData ); // no childs yet -> simply append + else + m_domParentElement.insertBefore( m_domCharData, domFirstChildNode ); + } + else // insert as last child + m_domParentElement.appendChild( m_domCharData ); + + m_pDocument->updateNodeCreated(m_domCharData); +} + +void KXECharDataCommand::unexecute() +{ + if ( m_domCharData.parentNode().removeChild( m_domCharData ).isNull() ) + kdError() << "KXECharDataCommand::unexecute error removing the selected node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domCharData); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +/////////// Inserting new proc instr. ////////// +////////////////////////////////////////////////////////////////////////////////////////// + +KXEProcInstrCommand::KXEProcInstrCommand( + KXEDocument *pDocument, + QDomDocument * pDomDoc, + bool bAtTop, + QString strTarget, + QString strData + ) + : KXECommand(pDocument) +{ + if ( pDomDoc == 0 ) + { + kdError() << k_funcinfo << "KXEProcInstrCommand::KXEProcInstrCommand - The given parent object is empty." << endl; + return; + } + + m_pDomDoc = pDomDoc; + m_bAtTop = bAtTop; + + m_domProcInstr = pDomDoc->createProcessingInstruction( strTarget, strData ); +} + +KXEProcInstrCommand::KXEProcInstrCommand( + KXEDocument *pDocument, + QDomElement & domParentElement, + bool bAtTop, + QString strTarget, + QString strData + ) + : KXECommand(pDocument) +{ + if ( domParentElement.isNull() ) + { + kdError() << k_funcinfo << "KXEProcInstrCommand::KXEProcInstrCommand - The given parent object is empty." << endl; + return; + } + + m_domParentElement = domParentElement; + m_pDomDoc = 0; + m_bAtTop = bAtTop; + + m_domProcInstr = domParentElement.ownerDocument().createProcessingInstruction( strTarget, strData ); +} + + +KXEProcInstrCommand::~KXEProcInstrCommand() +{ +} + +void KXEProcInstrCommand::execute() +{ + if ( m_pDomDoc ) + { + // Insert root proc. instr + m_pDomDoc->appendChild( m_domProcInstr ); + } + else + { + if( !m_domParentElement.isNull() ) + { + // Insert child proc. instr + if ( m_bAtTop ) + { // insert as first child + QDomNode domFirstChildNode = m_domParentElement.firstChild(); + if ( domFirstChildNode.isNull() ) + m_domParentElement.appendChild( m_domProcInstr ); // no childs yet -> simply append + else + m_domParentElement.insertBefore( m_domProcInstr, domFirstChildNode ); + } + else // insert as last child + m_domParentElement.appendChild( m_domProcInstr ); + } + else + { + kdError() << "KXEElementCommand::execute document and element object is empty." << endl; + } + } + m_pDocument->updateNodeCreated(m_domProcInstr); +} + +void KXEProcInstrCommand::unexecute() +{ + if ( m_domProcInstr.parentNode().removeChild( m_domProcInstr ).isNull() ) + kdError() << "KXEProcInstrCommand::unexecute error removing the selected node." << endl; + else + { + m_pDocument->updateNodeDeleted(m_domProcInstr); + } +} + + diff --git a/part/commands_insert.h b/part/commands_insert.h new file mode 100644 index 0000000..4d9da8d --- /dev/null +++ b/part/commands_insert.h @@ -0,0 +1,94 @@ +/*************************************************************************** + commands_insert - description + ------------------- + begin : Wed Nov 26 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : lvanek.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef COMMANDS_INSERT_H +#define COMMANDS_INSERT_H + +#include + +#include "kxecommand.h" +#include "kxechardatadialog.h" + +/** +@author The KXMLEditor Team +*/ +class KXEElementCommand : public KXECommand +{ + public: + KXEElementCommand(KXEDocument*, QDomDocument *, QString, QString, QString); + KXEElementCommand(KXEDocument*, QDomElement &, QString, QString, QString, bool); + ~KXEElementCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Insert element"); } + + protected: + QDomDocument * m_pDomDoc; + QDomElement m_domParentElement; + bool m_bAtTop; + QDomElement m_domElement; +}; + +class KXEAttributeCommand : public KXECommand +{ + public: + KXEAttributeCommand(KXEDocument*, QDomElement &, QString, QString, QString); + ~KXEAttributeCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Insert attribute"); } + + protected: + QString m_strNamespace; + QString m_strQName; + QString m_strValue; + QDomElement m_domOwnerElement; +}; + +class KXECharDataCommand : public KXECommand +{ + public: + KXECharDataCommand(KXEDocument*, QDomElement &, bool, CharDataKind, QString); + ~KXECharDataCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Insert char data"); } + + protected: + + bool m_bAtTop; + QDomElement m_domParentElement; + QDomCharacterData m_domCharData; +}; + +class KXEProcInstrCommand : public KXECommand +{ + public: + KXEProcInstrCommand(KXEDocument*, QDomDocument *, bool, QString, QString); + KXEProcInstrCommand(KXEDocument*, QDomElement &, bool, QString, QString); + ~KXEProcInstrCommand(); + virtual void execute(); + virtual void unexecute(); + virtual QString name() const { return i18n("Insert proc. instr."); } + + protected: + QDomDocument * m_pDomDoc; + QDomElement m_domParentElement; + bool m_bAtTop; + QDomProcessingInstruction m_domProcInstr; +}; + +#endif diff --git a/part/dcopiface_part_ro.cpp b/part/dcopiface_part_ro.cpp new file mode 100644 index 0000000..c2794d0 --- /dev/null +++ b/part/dcopiface_part_ro.cpp @@ -0,0 +1,67 @@ +/*************************************************************************** + dcopiface_part_ro.cpp - description + ------------------- + begin : Tue Oct 23 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include "dcopiface_part_ro.h" +#include "kxmleditorpart.h" +//--------------------------------------------------------------------------- +// KXMLEditorPartIfaceReadOnly +//--------------------------------------------------------------------------- +QString +KXMLEditorPartIfaceReadOnly::saveAsFile(const QString & ) +{ + return "Not implemented."; +} + +QString +KXMLEditorPartIfaceReadOnly::selectNode(const QString & szPathToNode) +{ + m_pKXEPart->slotPathSelected(szPathToNode); + + if ( m_pKXEPart->getSelectedPath() == szPathToNode ) + return "Selecting node failed."; + + return QString(); +} + +QString +KXMLEditorPartIfaceReadOnly::currentNode() const +{ + return m_pKXEPart->getSelectedPath(); +} + + +//--------------------------------------------------------------------------- +// KXMLEditorPartIface +//--------------------------------------------------------------------------- +QString +KXMLEditorPartIfaceReadWrite::openURL(const QString & szURL) +{ + KURL url(szURL); + if (! url.isValid () ) + return "URL is not valid."; + if ( m_pKXEPart->openURL(url) ) + return QString(); + else + return "Opening URL failed."; +} + + +QString +KXMLEditorPartIfaceReadWrite::close() +{ + return "Not implemented."; +} + diff --git a/part/dcopiface_part_ro.h b/part/dcopiface_part_ro.h new file mode 100644 index 0000000..90f5982 --- /dev/null +++ b/part/dcopiface_part_ro.h @@ -0,0 +1,124 @@ +/*************************************************************************** + dcopiface_part_ro.h - description + ------------------- + begin : Tue Oct 23 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef DCOPIFACE_PART_RO_H +#define DCOPIFACE_PART_RO_H + +#include + + +class KXMLEditorPart; + /** + * Allows perform action on represetntaion of XML file via DCOP protocol. + * behavies as interface to @ref KXMLEditorPart and to it adresses most of requestests received by DCOP + * + *@see KXMLEditorPart + * + *@short Read only DCOP interface for XML document Kpart based kxmleditor. + * + *@author The KXMLEditor Team (matkor@users.sourceforge.net) + **/ + +class KXMLEditorPartIfaceReadOnly + :virtual public DCOPObject +{ + K_DCOP + +protected: + /** @ref KXMLEditorPart which Iface represensts **/ + KXMLEditorPart * m_pKXEPart; + +public: + /** + * Default constructor + * + * @param kxe_part Specifies on what @ref KXMLEditorPart will interface operate. + **/ + KXMLEditorPartIfaceReadOnly(KXMLEditorPart * kxe_part,const char * dcop_name = "KXMLEditorPartIface") + : DCOPObject(dcop_name) + { + m_pKXEPart = kxe_part; + } + virtual ~KXMLEditorPartIfaceReadOnly() + {}; +k_dcop: + /** + * Saves document as file + * + * @returns Error description or empty string if file succesfully saved. + **/ + + QString saveAsFile(const QString & path_to_file); + + /** Tries to change current node + * @param pathToNode Path to new node + * @returns Empty string if selection OK otherwise error description + **/ + QString selectNode(const QString & pathToNode); + + /** Returns path to current node + * @returns If error empty string + **/ + QString currentNode() const; + +}; + + + + /** + *@short Read/Write DCOP inteface for Kpart based kxmleditor. + *@author The KXMLEditor Team + **/ +// +class KXMLEditorPartIfaceReadWrite + :public KXMLEditorPartIfaceReadOnly +{ + K_DCOP + /** + * Default constructor + * + * @param kxe_part Specifies on what @ref KXMLEditorPart will interface operate. + **/ +public: + KXMLEditorPartIfaceReadWrite(KXMLEditorPart * kxe_part,const char * dcop_name = "KXMLEditorPartIface") + : DCOPObject(dcop_name) + ,KXMLEditorPartIfaceReadOnly(kxe_part,dcop_name) + {} + virtual ~KXMLEditorPartIfaceReadWrite() + {}; +k_dcop: + + /** + * Opens given file + * + * @returns Error description or empty string if file succesfully loaded. + **/ + QString openURL(const QString & szURL); + + /** + * Closes object behind interface. + * In curent implementation it means closing entire KXMLEditor. + * + * @returns Error description or empty string if program closed. + **/ + QString close(); + + +}; + + +#endif // DCOPIFACE_PART_RO_H diff --git a/part/icons/Makefile.am b/part/icons/Makefile.am new file mode 100644 index 0000000..41028ae --- /dev/null +++ b/part/icons/Makefile.am @@ -0,0 +1,155 @@ + +EXTRA_DIST = hi16-action-bookmark_next.png hi16-action-xml_cdata.png hi16-action-xml_comment.png hi16-action-xml_text.png hi16-action-bookmark_prev.png hi16-action-collapse_node.png hi16-action-expand_node.png hi16-action-xml_delete_attribute.png hi16-action-xml_delete_contents.png hi16-action-xml_delete_element.png hi16-action-xml_delete_procins.png hi16-action-xml_edit_attribute.png hi16-action-xml_edit_contents.png hi16-action-xml_edit_element.png hi16-action-xml_edit_procins.png hi16-action-xml_insert_attribute.png hi16-action-xml_insert_contents.png hi16-action-xml_insert_element.png hi16-action-xml_insert_procins.png hi16-action-xml_move_item_down.png hi16-action-xml_move_item_up.png hi22-action-bookmark_next.png hi22-action-bookmark_prev.png hi22-action-collapse_node.png hi22-action-expand_node.png hi22-action-xml_delete_attribute.png hi22-action-xml_delete_contents.png hi22-action-xml_delete_element.png hi22-action-xml_delete_procins.png hi22-action-xml_edit_attribute.png hi22-action-xml_edit_contents.png hi22-action-xml_edit_element.png hi22-action-xml_edit_procins.png hi22-action-xml_insert_attribute.png hi22-action-xml_insert_contents.png hi22-action-xml_insert_element.png hi22-action-xml_insert_procins.png hi22-action-xml_move_item_down.png hi22-action-xml_move_item_up.png hi32-action-bookmark_next.png hi32-action-bookmark_prev.png hi32-action-xml_move_item_down.png hi32-action-xml_move_item_up.png lo16-action-bookmark_next.png lo16-action-bookmark_prev.png lo16-action-collapse_node.png lo16-action-expand_node.png lo16-action-xml_delete_attribute.png lo16-action-xml_delete_contents.png lo16-action-xml_delete_element.png lo16-action-xml_delete_procins.png lo16-action-xml_edit_attribute.png lo16-action-xml_edit_contents.png lo16-action-xml_edit_element.png lo16-action-xml_edit_procins.png lo16-action-xml_insert_attribute.png lo16-action-xml_insert_contents.png lo16-action-xml_insert_element.png lo16-action-xml_insert_procins.png lo16-action-xml_move_item_down.png lo16-action-xml_move_item_up.png \ + lo32-app-kxmleditor.png lo16-app-kxmleditor.png \ + hi32-app-kxmleditor.png hi48-app-kxmleditor.png + +install-data-local: + $(mkinstalldirs) $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/ + $(INSTALL_DATA) $(srcdir)/hi16-action-bookmark_next.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/bookmark_next.png + $(INSTALL_DATA) $(srcdir)/hi16-action-bookmark_prev.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/bookmark_prev.png + $(INSTALL_DATA) $(srcdir)/hi16-action-collapse_node.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/collapse_node.png + $(INSTALL_DATA) $(srcdir)/hi16-action-expand_node.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/expand_node.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_delete_attribute.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_attribute.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_delete_contents.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_contents.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_delete_element.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_element.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_delete_procins.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_procins.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_edit_attribute.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_attribute.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_edit_contents.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_contents.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_edit_element.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_element.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_edit_procins.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_procins.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_insert_attribute.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_attribute.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_insert_contents.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_contents.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_insert_element.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_element.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_insert_procins.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_procins.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_move_item_down.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_move_item_down.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_move_item_up.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_move_item_up.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_text.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_text.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_cdata.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_cdata.png + $(INSTALL_DATA) $(srcdir)/hi16-action-xml_comment.png $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_comment.png + $(mkinstalldirs) $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/ + $(INSTALL_DATA) $(srcdir)/hi22-action-bookmark_next.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/bookmark_next.png + $(INSTALL_DATA) $(srcdir)/hi22-action-bookmark_prev.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/bookmark_prev.png + $(INSTALL_DATA) $(srcdir)/hi22-action-collapse_node.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/collapse_node.png + $(INSTALL_DATA) $(srcdir)/hi22-action-expand_node.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/expand_node.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_delete_attribute.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_attribute.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_delete_contents.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_contents.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_delete_element.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_element.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_delete_procins.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_procins.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_edit_attribute.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_attribute.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_edit_contents.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_contents.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_edit_element.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_element.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_edit_procins.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_procins.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_insert_attribute.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_attribute.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_insert_contents.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_contents.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_insert_element.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_element.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_insert_procins.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_procins.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_move_item_down.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_move_item_down.png + $(INSTALL_DATA) $(srcdir)/hi22-action-xml_move_item_up.png $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_move_item_up.png + $(mkinstalldirs) $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/ + $(INSTALL_DATA) $(srcdir)/hi32-action-bookmark_next.png $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/bookmark_next.png + $(INSTALL_DATA) $(srcdir)/hi32-action-bookmark_prev.png $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/bookmark_prev.png + $(INSTALL_DATA) $(srcdir)/hi32-action-xml_move_item_down.png $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/xml_move_item_down.png + $(INSTALL_DATA) $(srcdir)/hi32-action-xml_move_item_up.png $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/xml_move_item_up.png + $(mkinstalldirs) $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/ + $(INSTALL_DATA) $(srcdir)/lo16-action-bookmark_next.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/bookmark_next.png + $(INSTALL_DATA) $(srcdir)/lo16-action-bookmark_prev.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/bookmark_prev.png + $(INSTALL_DATA) $(srcdir)/lo16-action-collapse_node.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/collapse_node.png + $(INSTALL_DATA) $(srcdir)/lo16-action-expand_node.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/expand_node.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_delete_attribute.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_attribute.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_delete_contents.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_contents.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_delete_element.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_element.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_delete_procins.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_procins.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_edit_attribute.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_attribute.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_edit_contents.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_contents.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_edit_element.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_element.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_edit_procins.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_procins.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_insert_attribute.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_attribute.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_insert_contents.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_contents.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_insert_element.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_element.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_insert_procins.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_procins.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_move_item_down.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_move_item_down.png + $(INSTALL_DATA) $(srcdir)/lo16-action-xml_move_item_up.png $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_move_item_up.png + $(mkinstalldirs) $(kde_icondir)/locolor/32x32/apps/ + $(INSTALL_DATA) $(srcdir)/lo32-app-kxmleditor.png $(kde_icondir)/locolor/32x32/apps/kxmleditor.png + $(mkinstalldirs) $(kde_icondir)/locolor/16x16/apps/ + $(INSTALL_DATA) $(srcdir)/lo16-app-kxmleditor.png $(kde_icondir)/locolor/16x16/apps/kxmleditor.png + $(mkinstalldirs) $(kde_icondir)/hicolor/32x32/apps/ + $(INSTALL_DATA) $(srcdir)/hi32-app-kxmleditor.png $(kde_icondir)/hicolor/32x32/apps/kxmleditor.png + $(mkinstalldirs) $(kde_icondir)/hicolor/48x48/apps/ + $(INSTALL_DATA) $(srcdir)/hi48-app-kxmleditor.png $(kde_icondir)/hicolor/48x48/apps/kxmleditor.png + + +uninstall-local: + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/bookmark_next.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/bookmark_prev.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/collapse_node.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/expand_node.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_delete_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_edit_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_insert_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_move_item_down.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/xml_move_item_up.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/bookmark_next.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/bookmark_prev.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/collapse_node.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/expand_node.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_delete_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_edit_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_insert_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_move_item_down.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/xml_move_item_up.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/bookmark_next.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/bookmark_prev.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/xml_move_item_down.png + -rm -f $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/xml_move_item_up.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_text.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_cdata.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_comment.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/bookmark_next.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/bookmark_prev.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/collapse_node.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/expand_node.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_delete_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_edit_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_attribute.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_contents.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_element.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_insert_procins.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_move_item_down.png + -rm -f $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/xml_move_item_up.png + -rmdir $(kde_datadir)/kxmleditor/icons/hicolor/16x16/actions/ + -rmdir $(kde_datadir)/kxmleditor/icons/hicolor/22x22/actions/ + -rmdir $(kde_datadir)/kxmleditor/icons/hicolor/32x32/actions/ + -rmdir $(kde_datadir)/kxmleditor/icons/locolor/16x16/actions/ + -rm -f $(kde_icondir)/locolor/32x32/apps/kxmleditor.png + -rmdir $(kde_icondir)/locolor/32x32/apps/ + -rm -f $(kde_icondir)/locolor/16x16/apps/kxmleditor.png + -rmdir $(kde_icondir)/locolor/16x16/apps/ + -rm -f $(kde_icondir)/hicolor/32x32/apps/kxmleditor.png + -rmdir $(kde_icondir)/hicolor/32x32/apps/ + -rm -f $(kde_icondir)/hicolor/48x48/apps/kxmleditor.png + -rmdir $(kde_icondir)/hicolor/48x48/apps/ diff --git a/part/icons/hi16-action-bookmark_next.png b/part/icons/hi16-action-bookmark_next.png new file mode 100644 index 0000000000000000000000000000000000000000..12b6893b5faea02bdfcc5fff1c12d1253b9fc1e6 GIT binary patch literal 511 zcmVJp;h#)A64no`l4GyLMgR@H}I}5JPA|fL9 z;$lU)+(l}^zre-dR4%0srQp&{uzZV9tj0u8LyAk%;X?2y75a`Z-+8|Co+Ak%I37*Y zJYCl%?wr82rKV}#e*rq3&fSo!0DyM8eHSEHEEfGou~>{~G>YeWY&IL3&E`Kdk%SPa zs_G2}17um|a5%8r?XYbd*L8`<<5VgYZb1S7LI^3B%P}60SuU5pSe9ih%c9X}+&o7* zu2EH0uT(0LOeV1`i~W92I2(7UWnA@E2cS_ku-=LJa@_002ovPDHLkV1nAT B-Ln7y literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-bookmark_prev.png b/part/icons/hi16-action-bookmark_prev.png new file mode 100644 index 0000000000000000000000000000000000000000..32cbc7a3002da2cca3ef0e624a1e7511aab92027 GIT binary patch literal 545 zcmV++0^a?JP)L{oZw^7UMATpjbaBYiO}9e-flf~LUl0z3 z6I>32LMslTD5acSYdOJ=)x}J=+734AnU%!0g@<0Xr9v&iZ-_-$-pFRR$`P-s>al_T%J!gJEyESF0*n+@S` z7){eq6oqQFx0Bb@R0NKb7HX=tJMn2vPdSA z$g)f#kwDk=(>vHla=9GQXp~SWgl*d_77JRf7D9;AljxNYLTWaf%;)o?FyMa|{E$|w jbrgmNnt19shr{#_C$#qj{8F)}00000NkvXXu0mjfXHM_6 literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-collapse_node.png b/part/icons/hi16-action-collapse_node.png new file mode 100644 index 0000000000000000000000000000000000000000..9efc36a49364eb8046acd212529afb8417ad49ff GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`fu1goAr*7pPTI(Mz<`IvUvY7U z!1}xk68pP@c5-AU?fcs7a8_PDz~j)#)UEss4b{3cZ(6&0el&dX&zvFjsy=grWv?*9 lF$0E4Nttg|&T0Q{V1F5KAdy;_q-)O#sRE-i_a%S9x9iM zI4h>>uf?|ND^r8OtIdx*&qZpp>CSoX&B>skw&IY|F>%(Mb793^nP(DM-v3RW@lQJS n!ON2&jFW;Ey)ujZdrth$64NiG@ij|<&SCI$^>bP0l+XkK)Er9_ literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_cdata.png b/part/icons/hi16-action-xml_cdata.png new file mode 100644 index 0000000000000000000000000000000000000000..ba70ca18ddcc1e7684b761e49281a76dbb3b114e GIT binary patch literal 547 zcmV+;0^I$HP)z>&)k#D_RCt_)lFw@sQ4q&J+Xw~GQVIcc@gO}^yd)Ah1Q$krOIwpJZ7;rvg-~)lqC&7P(xGdc97qR-@Hwk;=fbtcm^Y)m6TK zJK$4mm&J=YHvH|=0gf{OxLICdVSbJ)mzS849;5*b861ATLB;7}Szqb=EHgWsq1V|5 zQhuR76AzeQd^*Uib8g`;x9&JBU;mK~&>yT_M4(dH1RxAA;rpBH?G?rVZ(lt-(VQe* z9zS}Be(fra##wYd06cU(APiw`txgn0pp+8BK$KDLBEn#K(znSRaU2uJ zF-j?U^KyFx@cZyU00ATj5RqWe97qr_I-AhIxnCMTq1)kTzYTz{Ll_#sI$>y_>#(zN zmwY}y7SVNGty+yWfOm}-y#Mf#xeH5(c)Wi81jFdp^}gIg(_p!L9sn(l;|cK`$B}ls leL~bIiV*QA6t*Vv{{Ud`@Sv1cXh#45002ovPDHLkV1iqM@0|bu literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_comment.png b/part/icons/hi16-action-xml_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..1acd578b6a01f90ead023b32099ea02ff508ef6c GIT binary patch literal 504 zcmVz>&s!2paRCt_)lfR1-K@`V7&&0;Y$|8j)IXtkr+9Jhn{s>_X#3}>? z;krZI!fMl4DGE`N;gFNOLLL?Yz=xx9{@hL+p9E>jvn*p_YOa% z=RDkLaU6cW9QFX1nLZ0uESHHr1j4r79SnDk`xGpk> u`YPgy7-KX|)B5R+NRk9q9}%ze7ybjwD+v65(5fo{0000isGkwQbHa3OaZ;uR_~fC8vAa4tkT)Ssj49`D}c z-Q&?o;=l0T8-OG?&t-ea_j@%KXG@`%0x20F6^bH^=yDi z!oV7^BH$`u3s}_T z*_~Y{BK!v{>(YBadGDvc2&^sg@3l>501l2ef2BMuuz(5&8IZ**oB_CStarN2bXZ%n);O1#CoIJGZh`Tl!G|-upc$ xk*@;Ly~#E(iVW5wS?(4NO7x>Z?yj+!-(H~#cAmAM*XaNN002ovPDHLkV1fwBe%k;5 literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_delete_element.png b/part/icons/hi16-action-xml_delete_element.png new file mode 100644 index 0000000000000000000000000000000000000000..412206049d90d2fb02dd059d96dc74f623053168 GIT binary patch literal 358 zcmV-s0h#`ZP)Y`Z423`FG(rj$?#uzSK{P;$4B%lnh)WHS5vUDZq=Y*aDl&ram_i_hD7Me9A`g5I zKMxdD#Uq4}0aR6Z0qveVF1PjEwJ!-(0Z#@97ZVC?ekLNSN(dnrf`@*5!`yH8J3_Sr z{rXume!gvFL&|xLiPW}^A>^y7{Fy-&Ixl3)JQ*1PJ0C^zwDy<(2>|4|XR`CVtW}GV zvq+7_(t@f=2whDjhYQR-(Tf_I0axdS08cH`2G+?J8!H(qIRXQa?0&R$huta{3q5?l0Hcu)zJhxwR-Sj; zcT$xE%qG;Rst`Mf-S(=u@Id_Jhv>hv|H@@mA5~cJ3$lc)X9UB4kpKVy07*qoM6N<$ Ef?k}JTL1t6 literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_delete_procins.png b/part/icons/hi16-action-xml_delete_procins.png new file mode 100644 index 0000000000000000000000000000000000000000..184cba645406b5ae2b5da551e4e0d2042a702dab GIT binary patch literal 650 zcmV;50(Jd~P) zI}hjgKmT($M@T8z?zJ>GDS+O-Ct|xCi#hOmy~+%CbavBmyPM{u5P;9;Q)WgO4s=~t zp`j7l+AiaCIVs$i$1%4Hfne(6EYa9crl)3j_~wC9yjLYg!I_vJ0>;MR_|B zqOz(A0K2BCFH#CoTU)IHem|L+=^QF4A~*IDM}8bz@D%`OJx(5UwotS`pNV&qtQ2}V zRezpQ!$BhP2cJJcnspaTvF{Wla}_;YlXzumKuyuav?95Q$8S7Xu+N7#ilA)s3~dn%}Fd-2Bu} zI0p;xy-iR##WiF>`Y&-{QjY#AJ zJ@y!c&2IT<- zsIFwJKpC9a=@#soro5(p0iJ4_@&F~9XRsAK3Pj5sDgQw!MHpDrG_|7utWSGzXym_3 k44NG6C}6g}`57(z1z`K(hOC5r#sB~S07*qoM6N<$g4IkQ)c^nh literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_edit_attribute.png b/part/icons/hi16-action-xml_edit_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..10e5940d2b6c3acde7b6ff3276dc054d78de85ce GIT binary patch literal 296 zcmV+@0oVSCP) zA(FyC5JlfmBUf;Qh!z|H7X$}DMsO5F4znT>xnc!41P4I0h~NMbNUCN<=wXsg*lf`% zm7dr2-*>9YJ2QKW2K;{k5efFKs&3MO6gm`;ZwdgMNcdAhM8f@E0uZz!-xM78RouH* zB^vB~Nze+;d$_c)D_e!p1XEz>m1wTEywz>GK;$4j00*c_2S7YgQGx6Yf?!gbriEs@DwCOS zv+pOOs#v4VDjL8x79eTeSyd&YHbAmN00V<5OuZ z2gk6NAT)aQ@Gt!xV_xJz?8yYGDz5A2(`6A1EZl==gBY#;jc<4*ZX0J43pW4&002ov JPDHLkV1l<~VR`@n literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_edit_element.png b/part/icons/hi16-action-xml_edit_element.png new file mode 100644 index 0000000000000000000000000000000000000000..256a24eeb9752c2b934c250bd4b0a7f3494e8bb3 GIT binary patch literal 340 zcmV-a0jvIrP)p&>%-C&_N0d41ENd7Z?N-EDQ+95i+9!WgRI_J?_qU zR^HM3X8&YFgxs8S5kN!?E6hH_Uzb}tS9X=qB#^@ZZoCUQ8*>rOP{pkV-FU-aN_9D$ zW>9FMZdw40b8$0W?ypFHoxuPhCO%3>-LwpS_qqov#OFPg^NtWBdt->w!FLZo9rYGW z+aV%m^DHpgc?U0G0OKFcwb~5ls;N%i$K;10xsR55%LM0El%P{MR%K=TF8lF5eYwD2 zBb1$m5K>UR_r-1)AS#fX98ReZ3WqR*rwnv_u6cXFDkNf-*1IUS7-1e?Sm(ttu6abG(7#@zURI&CFu*Sf5u&1B;py=J0000&sX#rUzD=oCOi5Vsq#T9*P4r4)e{EEbDAYkP^)VV9)jB#vhvVQTyXx)__fr4BasrRXqd6URslVR9;D>f%f=AghISN31{c_nW&8rdsq@|e|>U+Vl ztpkK_*5lh`0G59SaJi~h%}LA3Ix6{jd4z_B5E~W2wu$E?7#EnD*JE}(<+L@4JGD+C zb{cu#+sE{-90rHRn3*zVhgPxptr?W2KG8*f!ggR6w- zxc&Sx>>wv97Vm=4{P+o)QVO#u6*jSBs@-GwP zK@5EJa=GRTL&Kx=4}8+Jl_XZXE=t9PG7=3V1ke2>Y`2LZqY(|5nG56lY&bV=-sbAH z`oItaAQcrBNNH&qpNEF&`yI)2L_P~)@hmJFnbpNJGHyVPj8R@uiOpsU;H(GOmz*TE zwKX7%^!In;>6|Tba?V~ta&n>!4t~)B6ec9ZNx{iH zIdm{p{3LdFy^(isyTxkB7Nr!K87XqA@PzD5hzk&_t+$P>EssQ}3!<>7SX)c8?l#`P h_W%$Ii;CCO{0F587?y8^O7j2!002ovPDHLkV1lB(JJJ9E literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_insert_attribute.png b/part/icons/hi16-action-xml_insert_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..b02f1e0a6261cd1de929e23ff4c9b4257cba66f1 GIT binary patch literal 369 zcmV-%0gnEOP)CiFo z9Fl8uO>KN|B=?g4FYo{E#fS)PVXajF5i$GEy8jUu#khRA+XNj2)WraGP=Iv)D-QAF zKcamEu-0nu3$R(v*(~ROiX#h$yw*YM8mLjhA+JR-=JevVA?V+JM@{Usc@2=Kmp*4V zca5X$9P^r{DXOkk$umiEqRu%@k~fWdaLDUyHUmHvvaGz%vU8?WSS%g^Fo3S-4_i?H z)V;1&mpT}{17E;3SvF!aNy`sZqpTH3m!DS(sEDBIRF!HuEhEk$BHI-}`+M(ERbPp{ zdSB)NHElnWwN}d>z;L*`=6TB~@5GKg7c&}_xn56KAMAHNd)m<7bsot P00000NkvXXu0mjfcjBT2 literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_insert_contents.png b/part/icons/hi16-action-xml_insert_contents.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cda992e333708b82d5173fef6789fc321391e7 GIT binary patch literal 343 zcmV-d0jU0oP)GP#|kj=$xyoXnp{LLZpU20gC8gs6-$tI}=0|!w<;$x{Yr{en2d05ot<7 z5-K|E%+1}rx%cMnyFF1=PN}n#*#9cvoHOT~9TPYoBX2&l!x=zTW$3Q_4zW#c*WFDx zDAH+Rj9g^fLHj)cfT}2|in2$JqKF{)=w&h*VpWuE)^9w#e6`S+Ah@(7NvshY46&){ z)s)3zOPappeT{j4O`5`PcV7dl+F5`Bwt8LL@^NW^d4FMMnVBVKmRXizQ4|?qy;o?; zIcH`G5bu!$cmkd~*k}f-Dk3o=?CsC?7m-fP!+75En^7QY>fS0FkyuoM2thQLN+?6i75Fw%`V= z^eMc%iL(K|WZ5(0Kc4Ry3n8!%=bQjS2sQ}r;rI}FRX6cGI{r7&(Qjmcan&%cn!ch# zuug(=PUET>T==+N!)DUk`_&{8KAykg%Qt6Ra*I;22xpeaN+j$i>dBi)PX<5&sh2hQ z!~~lONX+*A%jHl)2*I2iZJ#=?;_f{F+0zq6;jra*l4~GgRX42a1~wD2EJM@Ro#-4r z+>^b(BjsrYhg$ds+}_@yVveUP=z^kv&(Hh5bO4R3X0SM~1jzdnNu{J*QmL{;S(XV< zpMXUz7Ii|71lpA=BJ~aaV7G;4bIiJbyaFD9E4&A@82`JCEv8fOe%9{MP6jE2U@S(k z7;RbY_)0nJb+Fkix=&AonZf1dOFBqh#%>lmd%c}zAn)&X{vQGF>`#ku1?~U<002ov JPDHLkV1gh$xc2}6 literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_insert_procins.png b/part/icons/hi16-action-xml_insert_procins.png new file mode 100644 index 0000000000000000000000000000000000000000..824ee570c03351f3f6bf5b5244935fbba50e6eaf GIT binary patch literal 689 zcmV;i0#5yjP)b*CTRx_ zhkLl+cfND)IYLT_{j9#OmH_bRaj)3#jxP3Kx7!&DZf4PtBmSs~hL49T*#XC*lYqRomJ-F#CA~ z$Mo|^O$tJ%(_tlOz`~9hrzE?~NmXugIR%~1sw!CRbRs!933;X*qy>gim=VOvmV%bv86+r)c+gspoFf?+|1^R1 zY&&M>zG7oz3$F%-poBu(a5$@>R}!!s_=(I=8bZ1y^o-2o-V?6?fX=&(?6`FqNApYY z%a8@TDG%F0qVGjNAf<%Sn9NeEg-?6CIOn~?@BKAg`_RFL8XFsG&vR$}EnO}bNzm&V z;HlDL8V?yLr3`=L4E;QcK&} zayB+z=g{yVfe1*8x~73Hmx}-xRZv)%&x;qFEIV_8yR$(u)-{Gri_43HcA=o4fB>Lr zfU0WIyw7KY&9-Nh4wpwvNswQ#gPGOLZy-*Rx4R2N2dk_Hki%Kv5n0T@z%2;EjP)t;6M=&4 zC7!;n>=!ttIV9NK`XWGf$a}gthE&W+PHON V)~1Sk`vR3Rc)I$ztaD0e0s!P7E}H-V literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_move_item_up.png b/part/icons/hi16-action-xml_move_item_up.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb1b688e5ecb78a917f957c5c1e227195945bca GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|nfKQ0) z|NsAi%+N!Z>wpwvNswQ#gPGOLZy-*Rx4R2N2dk_Hki%Kv5n0T@z%2;EjP)t;6M=&4 zC7!;n>=!ttImEPIU6u3)3dwuAIEGZrNltKJ?cwD)!!B_{-rz%h!i4_^6aKUN$}v<` Wvexc@`TQMFDTAl0pUXO@geCw55-^Sc literal 0 HcmV?d00001 diff --git a/part/icons/hi16-action-xml_text.png b/part/icons/hi16-action-xml_text.png new file mode 100644 index 0000000000000000000000000000000000000000..fb485a3fc07081d5c92699c5d042bb35f574c9b9 GIT binary patch literal 580 zcmV-K0=xZ*P)z>&_DMuRRCt_)ld)@4Q5431*F?n^Bb7gSBqWJw3-;vkw71)cJ+V4g)DXgjpFh8o+Z`qOSXfvv$7xZ3LZL7wc%PRkmaC-GX#gDui4K#=$;prqi^Vv<_=;>cJ1iXu zi5@NtBOZ?vi9~2L8Y777x^f&R1PK9(#o{Q>WHKZY2`ZHerBaDzvw7r0AwVXR35oY- zXW81^V5Patr3(ql)ffK;{Otf>=H4CR=gxBV%4JTd561zFF(C(%2)Z4jr_ONl^aR^q z?((G4qtUpHG0r$Z(#U}%`au^3KJ~XBkn$Ll!&(dEkUULKKcrf{hA}yVwN{?zNs@w~ zr|$la_J3_^x3wloversMwHl$@^A;8AK@jvPK7EV=pMKzv?i<%Hva~coGPwx6Bbl6{ zUQaPUUjfj_L3gjM{q}e5w!W#ov7+s@kCO6|I5>F?B3%39!0%9c_8bL1>JJ>uJs7Nb ztp>^D6i@)BsMjHt0?09Pu=C@q+Uu^i*BrIH_u5){qm555b9f-I_zn^Sb<#n=_A)AeF)lpm`aSGsapg*LBAh2^;Y!lR S_U|?T0000nXo#(?d&-;5{VHgIVV|8`fSX^B6J_`&mKR^Fuyd!MeHd|X;NGYF$cZ6Nn1>pGj z_(^z2xT~v+TCK+Q_4SkR06;dI^#Ftrc%FxjhXqv|C>}*>+a35=YWEh5!QhIA^Yt-v?Zf|d?R4Uxv-JvK70|NuNuFK)!VcWF$ z9ZM;_zdjb}8~d`QgGPQgH#Zp`9wr`-6NyA9m&@3;jb&L34Gl3jH`h`ZXhv&q>eS6T zK{fcGgY)xqT-W8~<(FvJ&9^WHpv%hJnb zPG9AL-}&^ufHNJ&e0NFn%vV-ca2$tXv50NkjE#)};5ZJh>$1PUkCf62G#3FrZoarA z_94m-KmF*B!!Qhy$z;4tCPOlrq^G9`$8mi4>gtMIF86Q8%|%j5FZ#2>i4_{M4?b%dwbhIzz46}Hy`Ku b-MoJQicE=|3=$GR00000NkvXXu0mjfhjx{N literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-bookmark_prev.png b/part/icons/hi22-action-bookmark_prev.png new file mode 100644 index 0000000000000000000000000000000000000000..33ecf839e4244de6fde6605be551ee70e7b8829c GIT binary patch literal 859 zcmV-h1ElxV4-?%7xz!-!VB#m;6kJnT7q4;kuFjwZd?>fKL{hmUPMh(kz{6)OlCS= zTw;@(M7{KZSq$f$-+9h6?|X!<>%57il-@%%x~_|^PKyf*3mpMh*#cMD0%pE^_grNQ zcTj+iV1T)~xwi0|9}Hf8`8Pi%f9BVZ|D^PrN$i8ZJLtV&+qT);+iQDt?~fq%twF6^ z1R(PMTP@#r1iP*az{$x;$6Vk3FvMTql=%INU#J_-_BJU0%S`?PvV- z{2X`%f1*C|M7`a{$H%>cg99{8qgJaSgrK{-n_{tuWm)+Beg*~xn4Fvh{`>n8+u7M+WMqU;DAW|m+1VMXRH`L1UDt(_(&Gi} z^7-9{;`ITMQhHlkTO^Z7d_EtFqA)Qrfn{0PwoRo{Ar^}kJD0mquNDJYfuIcNFtX8u_Q>;p)tnA zL=6rEjFXFr1DmssG7ut@xZnc8IG9LuKLd zQ9eD~3d4_S3;L<5s-mo{Y%PR=fdN9H5ET^_w70htjYjhd6XoUQvg^@vye>OE!xP-> zeYGV-RaLB3D*&ph<|P*gN=xOw+e2i(yyuv@o6`sP;C0#QAD!gJ{UK73hqTrEHZ^H( zZl<%db6dG3YnqHN3FfC3$V!+=rcoVMoHm6=S5M(}o#nyUB$s<%vD|fwwxA!o-JWw5 z765Z@9Q*Vf(d2jD6j?#BP~-P7GM{9h-Nyc1HU_Sp!RtCt&+r7_USG*AcDvmqXJTY# zKcXypu-OVx9Co6q%t{DQ12S`6E!TvztR(la&PDZlOMjII6M^D ztQ5G5iG6nDF)vuM*(|A43d1lk41-K2gRmBgb4L!!3rEXHEH3b5JkFgLV@!Se%G;%R z)O^H=M1s-LQT%>CQc6tIB$LU=wUD%7a#VG2>|#B}@-lt>{fw=?>Fp4@uA^z1tgWpj z5D3uJ)I@P{F@|AKS67!;?KN~=Uthij*mOynrpfB+YAP!$0gy63sSpqjhh;-UgIE`D zWMfEoceflI+|khMY!Uy;@#FtMtn0c6hr@X;V>4pyqtAt+DAF`dA*GZ;2$4)CrPJyB u?WGjtJArAM0zj;u-FDI)iFeBXC;kE7Bofs%#Q5uC9*m?(T$Qalz-$p2m^{hmX3+ zNM8zoJ{pV)`3L&guyJ!jxK(qVQ?~pqM11YA>EN%Mwt2XZS90sdB|_i&urJPH_r7CM z5xd>atIp?CR8*+?`uezVE5PNd0~9Sjgs<-l^D1r<@%3=}aTTMFt};5*j|GE!_ZtWf zcEkK->_2jn6)Up{hr=^kVFkF;`<-WBEM)25xOT+Jy5)O#^Ld0twGVzx0(`w&Lpb0^ zANJGesb$yUGl?w5DsP_?nyW^=th~sQ54}JyJ99HhUyvLlvhuOG)`zN zlo%YndN+V|;3F2hou~dm!Yh`<6A zVHx4=m1>lNwl*j&jSr4mq3b$DIQf`S6_^Yig~ zy$KGbPOyJlFc`@TPkHU%*mI(b3V7@Bsb< X4)HimC)D%-00000NkvXXu0mjf62)i- literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_delete_attribute.png b/part/icons/hi22-action-xml_delete_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..caef038d4cb0bca7110b2dbbeb70424aeb5bb2e2 GIT binary patch literal 389 zcmV;00eb$4P)7tNR*N5 z`1kSdy(1Mf<3D1TdVq+G95b_e8calH97`Xtn=T43czFg20OMGqyI+1)vI;y01%O_E zMCTX5L}UgolAyqh#$j0i@aU%Qc|Fl0GzyLzG>r!?@aPyrx7?zh6iWu}sft2Qc{AS? zTMUxWbF3@Y7<9}Vgu+W`4WJirPvbd*j(LOH?#Zaa8vq4(Pyo;XTzb*22o3tWU!e2G z+hYLKM5dQeq4VmOSK5Qxj%%?NLRW*O>jksQ#99`C0#*uUR(mUaXkyq(Qq#ZUM`L&R zdb^pnZ4u5(sJ2;FHkpjbdKhck$`um;Ega+fltOP3yi>OH~*P~jq_i}XwpUO>~NEJo0;BoTP` z`R_&LAT7|kM_<3qkM11_Ns?B1si1_2lWed$IkOk+U0LPPKbZ11wKZ4(7T!I3O z?)=DT9xNjM=X>8MqM;Wp201phbK+@?)3_$6^&<=7Rzr^Twl jIe@91J8nz0+OO#c&vlE(4Qy_W00000NkvXXu0mjf<;|C8 literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_delete_element.png b/part/icons/hi22-action-xml_delete_element.png new file mode 100644 index 0000000000000000000000000000000000000000..c161c78f2cab095259146a50b0b67782544ad9ee GIT binary patch literal 453 zcmV;$0XqJPP)Io)&~7uL`-qh3vC`jPvac`H-fdB@a_R0IrKE%6DWYa+~Mm|bh4`A2-UzS zIb4g5mTM2X*eo}@u>j`KC?6(v3s_^SV@gIL=Nodq)uBU!49+( ze}*Q&sN=DQsDl#?4R~JypFklS#Z&eD^jZOhxndD9)^68Xsqex2>ZP5v;dfr*QnB7@ z^s>E7_M>e92yIK4KPPgI0QA5xFVVzEYac`EWjS04LqiV1N&!WTJ$4fVqw$o5hc8kG?2hGA;g<1M{=)}qWravn%L@okyfOFuS!`mMM z9c~-z+1`JC@AG_~=lTAg_k9&rRauQCB*aUA#>Qr4HU65_IOXJI%f{wr8k?HQ*_|!_ z7gz`()6!BF1P7UeSsN5eaBvuAbI=0+ojcQ|5MoI(#a#*^ge)s7BQ7?H$Y$siz`Z}^QvrtuaUM8J;mNot+;$o8kXlrR=!lBT3 z`!_o3e?em(LL$+4tt0nP9_bl-Flby@$0sqH&G>kGu3Rxd?i>5%haa7#r+0|oOV9Ia z%mf?5y)hU)(P}kJIi_guwsWOL%ih$@Sv&s0tLGi zV#7@6jXvl-y)bwM;9-g+BPE3sd)MJFMZh}nkOvl^?MA=uZ4&x%|4;>taw%g*VcNsb;njC0(EcrKA} z7X+FEDY{flL_`!VtsMvc?b9N)6eBhO}nUF zZjM{qIus#AY(3p8*mPKKvflOettdxTQ z6e&}a6Q%oiOL~&D+w4+GDJ|(qQdLzX$QrjLVL^;;QIcgZ@!`=4Zrr$zR-FDfI=Bi!J4!9*-HFzb!Vw>yaU!I!PBUxXWH2?qr07*qo IM6N<$f^ymzbN~PV literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_edit_attribute.png b/part/icons/hi22-action-xml_edit_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..83da5de77e78f72e43a60c9e70c4d39dc7c420b2 GIT binary patch literal 396 zcmV;70dxL|P) zFLJ^_6vy%J7DPn_M~HZbSl0+d4}jz@O%3O$-~h-9L~zRtA_}#F$#8&(iVB#m$e-DS zgeE|LYO|C1Wbb_g}zm4H}R0>&(t`6!=_gu0{E0MH^b?7=IB=4Vj&j9qQ*xFg3L@fcI7Wg?6P4 zt>Cr>-Gf4-#$|(E0_j92vaH5k=mqRQpjpR0n4jJ|@7inM3=c)2D226FO^Qv?Y~n3w q1(!HLIGee0i~93JqaOJ)_45ln|H!T!u-s7q0000BjQ9LMo*mkGoqZ$RH;Jit8;ey32#$;p!wh&@2(DkcyMswAX2F@d-@=)}TuK;a-| z`z19^^J(+%zo{_Buvbn}x)gX+io3r+-_vv-c#Hz!un!G}=TH>_FQJ6MPtFl(?M06v zFhCr~BGP(-8e_yFETweUqn}Tb#5GMLx~_8o>UbQW0QXDi>zkU)Ip^q6Yb|wMQv!F^PH-x2H-4w3svwtd|;nJDWsI{<@w}Y*s2dcSE4Y}6_@rr zK>;4Jf(A-^2>3E0TJoF8}}l07*qoM6N<$f~F3RZ2$lO literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_edit_element.png b/part/icons/hi22-action-xml_edit_element.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa4149c36b60a3a218ae753f9fd75c6bf8ff0f5 GIT binary patch literal 454 zcmV;%0XhDOP)Xo9%v3#EWd~bxcmUn6=rBlFUXi`e)+GA_2cm_H*rVkF#U3CFKS0LrY-7CsgN*ZRBg7!o(78OD z{`p<4KKsye)&Qw@>73(uJaR~q2nxhKZWkDXs`?2^_IsvT7D4qGI8r$SV|qXbh|Pv< zvG7o>8>qEb4ElIbhl795=Ml6h3eM*mMvL!u^Shi%Zx~(XbjVC%0R7XwJ5_kF{?^G{jfJjauuj0HbeJYQN`d;kpe z-=IIF;A(E9_nH@7um?fV#b=Y0lTSs(2AZ0h2wE(UK`X~vakjZdsi;^bUw`v0{;NHl zIJlKp^81;sCSZ)6gkG;>D5TMuwHkoC_XbFEItf}VQBY0Ol*humd9#;bD2~=+JK0#K zFlTBahSVIWuc$lQb$#h-0!tV{6Sx{U|;rxZ9XJnu#aQC*CwpJG>Pn;w-FP9fz zdXrJnbFTFq1qJ!i-tJYRz=Oddc2!sLe2ImI`UXxpo0A7!xrT~@vNI(2ow5e$YR(?9kJ<>k)Al#`yLKov&@nH3$0(hvvoqkTAK8jvv;P&0YsM@0qJTbf{$?w0) z)*rS2(Am{Bkt@+w{FCzXazz2W9lmip9IL+pj#u}L%VRUq00000NkvXXu0mjfh@KeN literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_insert_attribute.png b/part/icons/hi22-action-xml_insert_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..e074c5862ae28e6a39aedf54997afabcd794988a GIT binary patch literal 507 zcmVBjE6vuy8GL;Vb0D&5Et9OG31)8;6AU-gi{SgZGkm20V;Gt77DE$JZgNG_m$Y}8T zL^R|BXz*xw9WGL(NO5h2J`mEqlYaN^{(s#W5#fKtNtchTwOVb9h

    GTC2O=O&xL) z2C5G5=Cx3O-R_2LHK@(xVDL*&fX81y8@YqP)>_SFd@vODtnqV!0Jd3h(7T@93w;sX zE>LLaGG?0zdA8rCjivaPK&N)u3hG_n*IZGn_*j7e-hcRrG1G>Z%Zj@Q^!aNKXhLh? zBDR^7BDFzP=bYLlz03Qj%)IQI&1QOj{#{$a)dAWnb#8;|yi(<~gvN27G`%)(EiJ8qkQp?%U+OsEjf&crx3qOe*gaMe;Ff{(rT#<@)i xKl%izLm~M1x`d}`$aXsOityeW=r^`kfIscr7EbGhL)QQR002ovPDHLkV1lFi?zjK| literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_insert_contents.png b/part/icons/hi22-action-xml_insert_contents.png new file mode 100644 index 0000000000000000000000000000000000000000..8b463b1b71378720a87aeb15f79451fff329ac75 GIT binary patch literal 433 zcmV;i0Z#sjP)C$WYVDiioOCXF_L?Om)Ic9S(aL5Ig|3>MGKM z{Dou~)?~7qe7m>%yA@h%u3Gy6reth|5@;b?>Vp>R)KS3w3QfrKv<~-g38by85ba+roL2g=WVYONwqODXZ-$apT z#^cPt+es5eu-QBmzOU%m9`n?#TQ2W#-EZIr*By`~_k`gGfC+*?0Eo8R&2gm3dTIwY z1)hNClFuVewK%ye@}|@XSOX)*;~B0y_=gTi5(vXA9t65u#n!Sx%}5e(T@KGQEne|X zsyI$xi>yNE^|VlGRJkmjz-38U9S1=mlv)?yt$PfVppXr1cz~zrG13W~w@g<3#$C~Q bcx~+uFT%I$L_Iq!00000NkvXXu0mjf6m!BS literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_insert_element.png b/part/icons/hi22-action-xml_insert_element.png new file mode 100644 index 0000000000000000000000000000000000000000..83b71cbe6e5bd5deb21defd6f0826362202252c2 GIT binary patch literal 542 zcmV+(0^$9MP)a$k6o$WvoMunp!d<4dgP`Jnq z*3xVN!ww9#$^H@oW=7w<_vU|~M1;Py*2aAo5#=p9qscMo_^)&(tO~fLi zw4RQ$Qc*yjx3A{z61Dl`Eo&ooPt|%^?`r!IhJ$-7-`{~XB*}4CoNEpXH^FNUzipv$ z9Gk1FU#123o5S^U-^Wq(hPk_RM%Gwpmdz>48wD`=QgehMPtBvrp4zjlDs8e1K0a>! zQk-lKJ0_xR+AlBP2!b5g5(GI#0jt$d;y5+{3NT){4+G&>3+f)(w&~Z;E8s_OY(3J) z)dCSwQM4qA-iV@QQ-Q?sR=nb&Z37_Fk6%)?J8*BAG%mJsPPG zol};g?(dfX%w}~q)@tB%9zehQhQ76~rD|;fNYhkBQEajdQ gRhp&>=7Zmuzukc#@{t4~5dZ)H07*qoM6N<$f}4=`tpET3 literal 0 HcmV?d00001 diff --git a/part/icons/hi22-action-xml_insert_procins.png b/part/icons/hi22-action-xml_insert_procins.png new file mode 100644 index 0000000000000000000000000000000000000000..f861003a74ed136f8186b7acead5b3ab7b1e8dd8 GIT binary patch literal 1209 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 Q;Q#;t07*qoM6N<$f`~#AivR!s literal 0 HcmV?d00001 diff --git a/part/icons/hi32-action-xml_move_item_up.png b/part/icons/hi32-action-xml_move_item_up.png new file mode 100644 index 0000000000000000000000000000000000000000..046b99b207664bbaa806e6d75a0c3e22ddb05ecf GIT binary patch literal 762 zcmVkdg00004XF*Lt006O% z3;baP00002VoOIv0RM-N%)bBt010qNS#tmY3k(1N3k(52KqANh000McNliru&%=6(!oxNv9M_hp|1-g)W0qaj6uEyu9l7`^KNvA$$*jpo ztzgm-%T741ZPjbyfmP%RI`~r7!bL9+ROAS{_z}yh#@!LSXl6hb`vm>?C3Q8!VwVOe ziVwqoaysyN)Y-e>b@0bv!Lxht55haveHcE8h%-got$e|_qgK3|;b+2vWuM~X@L69K z4OH({m21crPq? z-n5Dz4V%dXQExJ4(TXW|oCw`E?rM6}r@~v&m@3vKdj%)WIplU9UPleQnV$M4yc*REo3XmTg@TeNLnnnb*VWNR(Wp_= zzH`Mj8~%zCt*nJC#Gq*`bVCfgw%VxqT{pzB(9G~%0>;BpE2=g{o>29eAw#L4AaTWl zDbuEm_xN55rLbh)oQbraZTD>3ww1nP4K1sNoODI0amSJvFl{h<_d z*0i-;Rq+x6o{?D7$~&4bXsG*ALm4}G;HJm3yVpOW{KbNjVlN;~yD!gy6+CUlS>J;) sHhgQ%6lKL7v# literal 0 HcmV?d00001 diff --git a/part/icons/hi32-app-kxmleditor.png b/part/icons/hi32-app-kxmleditor.png new file mode 100644 index 0000000000000000000000000000000000000000..763034dcca47d47bf49f14979b47ce999ae073c2 GIT binary patch literal 1813 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 at>p)Rbc~^3ECDnC0000ujP)y*V9aJ@k z5VoYn8XV>89FWk`()#atvEunTSvL`82_X0!PC{xWt~$(69AuiKGci;0qJ9mN!S?g}9hB;lJ*6F2PS5ZiD)z59cEpj6mlC+yVv+0lUjxGN>y5 z!O44!F>W!&?Gu5sM_$);{|8Xja3m0H1WUFMkwcL^!V!5G2G{vgrhDli=SGfs&BKPfRy6W`;wzg?@VA@{0b7f{tuTTdwga4+Aj zOhZGaouD?|uFsBr1-{Hi+z57Mmh8bTu_e#NbuLjZ=1SiRz-!*#i2Nx~-TUSOtH{GU lB+uQ06@4qvx?9vuJOO*KbfL5Y`Z423`FG(rj$?#uzSK{P;$4B%lnh)WHS5vUDZq=Y*aDl&ram_i_hD7Me9A`g5I zKMxdD#Uq4}0aR6Z0qveVF1PjEwJ!-(0Z#@97ZVC?ekLNSN(dnrf`@*5!`yH8J3_Sr z{rXume!gvFL&|xLiPW}^A>^y7{Fy-&Ixl3)JQ*1PJ0C^zwDy<(2>|4|XR`CVtW}GV zvq+7_(t@f=2whDjhYQR-(Tf_I0axdS08cH`2G+?J8!H(qIRXQa?0&R$huta{3q5?l0Hcu)zJhxwR-Sj; zcT$xE%qG;Rst`Mf-S(=u@Id_Jhv>hv|H@@mA5~cJ3$lc)X9UB4kpKVy07*qoM6N<$ Ef?k}JTL1t6 literal 0 HcmV?d00001 diff --git a/part/icons/lo16-action-xml_delete_procins.png b/part/icons/lo16-action-xml_delete_procins.png new file mode 100644 index 0000000000000000000000000000000000000000..ae65ec08cbeadbd9338b13febd1a48d07367e102 GIT binary patch literal 449 zcmV;y0Y3hTP)V_{3>+GILv-i12%wKf4b0q7&p#(XDjXlCGM5?foj>uLH` r|JuekcRiA}_<(He=YQ7taeDg;efdAx37Hs literal 0 HcmV?d00001 diff --git a/part/icons/lo16-action-xml_edit_attribute.png b/part/icons/lo16-action-xml_edit_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..aa176b1f482d9d9da34b6cd80ad017886155b7eb GIT binary patch literal 246 zcmVtJ=5<&>{Sykncz(`67 zh_T<_MhGF0EC2w~$ffkXT$Si#kq8nv4s!sQh^orc!4ontmFQW030T;iyY10F>SNRx zBn!zx0JJmO>|aXuciui1WlA=?eRly^jP4NFX0jvaSVj8XOddLj^;o{h-iOHC&5wX1 wHmf7fh%Lfuac1{az%1TpU11+BUS(b31O0}I3JIVEyZ`_I07*qoM6N<$f`cn&fdBvi literal 0 HcmV?d00001 diff --git a/part/icons/lo16-action-xml_edit_contents.png b/part/icons/lo16-action-xml_edit_contents.png new file mode 100644 index 0000000000000000000000000000000000000000..770d7d826a83e51e224c0900401cbacca1fdd063 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn`JhoqU@2hyssG`_*ZW z%q9fQ@?I#Sbju*fO0oUKL*Y%_Nq!9#-)^ueD@9yP?_~Qhm$gIVWt7XA5C$c$GY7Uk z{ae84G9_qN!u!uVUz!Hyc6DeztYx3E-umADDGn~0Edi`m&GLL+5vglgi?_udaxiR_ zTXX45YUHX_orZ2lBxb*U7LRZw!<{cetQQ{%yM1K9+( c)B8WN$P4F5Y_RDT1Uj3+)78&qol`;+0DLxD@c;k- literal 0 HcmV?d00001 diff --git a/part/icons/lo16-action-xml_edit_element.png b/part/icons/lo16-action-xml_edit_element.png new file mode 100644 index 0000000000000000000000000000000000000000..2a606328e0311e6f1cb480d854fc049acbb094e0 GIT binary patch literal 285 zcmV+&0pk9NP)rU!-rQ4=_QAhf%{M|n*){&B=JKt8vl%TC3ZzHGuntT3c$<)6S0oq zm+5#9Q$#003kGP3S`weo$=7dSk1g&WpqwG4i)=ZIpEXA?KvBg@6L|CLl9o;b$a}NFgA>zSr@gPT;z%E{3aql+?#wkMVe1V|U{-*yuuTv3Jfp zpC8SSU}iTigwNJFce}CtXW{AD7w~xmx9{~gfN_0(uXm@x_5|`i*4(c1t&KAmYV9n{ juEiV}nmvH|8`#Dh84;q#rH0}q00000NkvXXu0mjf!%lcN literal 0 HcmV?d00001 diff --git a/part/icons/lo16-action-xml_edit_procins.png b/part/icons/lo16-action-xml_edit_procins.png new file mode 100644 index 0000000000000000000000000000000000000000..080db8278a7488e29ea449a270449aa79dcdf972 GIT binary patch literal 480 zcmV<60U!Q}P)iJYOU3}t{KO1rklYrPI-*4Na*`sz4s=@r~v-wXH4k+0^e?nEVDLo z(ipk8G%f577#oOj0=)#!64u)LzE?=FJ5aT0rkf-CljjCd5i#R9>M#tP?!UwC06)HA zLPuTKocuj(Kfu>7G`~Kw-EJw0!dPqd4xnvY9fkq#y{VF$u6q20O7{$Y1fWU|@4Xp@ zfwpZmQv%Qsf`$-OM2In}N~fwfRaI5#G{&eRLauvezL=N|-0$}kMPV{CfaCFK0LF3D z>-9>EaW--`v94=QrxR6Gky29U+zf2nR#Qqi=eS%hlw~>h&D;mxd($+Hrj+Qq4uG;O zb$W&A8A1p&O@sH|0E-9NhdgpFBB<&gYwH>jSz3AB968SCvpVN^tH!+bonQXO*Wxz@ W{~(VjEIF?L00004?^k1z(qWRQ+y_HbtL`ydq3pi(3Y#c+?VZ6apIYQ-2Gz|7?H?C%$` zy8<9`2Ym&MVt^6UAmLYWTcxDS_XQAR^j2?O>5RD;h7xAAj-XQJPQ%QuyW+0Mt>=)^ zwTWR>YlFOAnQgm|GBk^`T6500b91uqyFZ`3On2|0+5_;M^E*H8W=4C2Qvmc!Rix(~ zb=3+6yivS?M)3%);r^KmP#a@rB697rNR2u|1q4t^>1VR~nd+1(WZU|F9E+zsijTu2 mokMy&s?#=wrGpu4%>M)b?C)A2O47vu0000jswz#>@OZ?{U0v6f$#zZ5Q4|IDd!Xwg!!XsJPj6iZsxLo8WR-vc*0!z1 z7!9zLFtapgN>~WN0NYF=46*jJwb>k$$YY+At z7yt>R&FId=Hatl9YPjw{viSZBCwT!iFq83w^5CtekBt=R2j1h$p1ZZo(Br&z%4A`f-x6Xt8 z2%XEBeT;wuA}M`pr+aXWafFnznJIb3F;C6R9A@^BQKb~^kZIQX*}d6=JdJi$*R^M4 cX0E>f1BMpzLOjfi_5c6?07*qoM6N<$g4aTlmjD0& literal 0 HcmV?d00001 diff --git a/part/icons/lo16-action-xml_insert_procins.png b/part/icons/lo16-action-xml_insert_procins.png new file mode 100644 index 0000000000000000000000000000000000000000..799e93a9b214c868f334901feb27199eba60e051 GIT binary patch literal 448 zcmV;x0YCnUP)d2P3`O4rDSU)=w}7Yc0a6Z-)@3?RDz~{s=tC@!assIEc3W<#z$*6uDmZ1JE4bqp zlaVE3wFC%KB>yM%AvslL$-MUlpsH?Z=I$0yLEd{)Ri~J>TSR20$^ETZWkU}SPaK;b*z!st`F^=D)kIaD158!jFbtM+=CJxbZhXJ&062sd zY`($IH{LHhHk%FW_1byw?GB)68p}BoLU6}^TW;IGa0sg}@Sf-AH`t#DA-J3~P16)D zzBI5Hqs16aRS^+0Jz0#=%$VhM&J0u4LQqLW#Lnll)tZQm!)?nfj<^a=DVdpB1&N5& zUIDeEw{5uuu#rGjNhw_$lucJ}tynv&&t9SW?eo7bs6DszGkNbV#>nY(!VEq>;PLSq qb1om#B0(iFE5l3qe+ibzruDx9yLd&1hVpO#0000wpwvNswQ#gPGOLZy-*Rx4R2N2dk_Hki%Kv5n0T@z%2;EjP)t;6M=&4 zC7!;n>=!ttIV9NK`XWGf$a}gthE&W+PHON V)~1Sk`vR3Rc)I$ztaD0e0s!P7E}H-V literal 0 HcmV?d00001 diff --git a/part/icons/lo16-action-xml_move_item_up.png b/part/icons/lo16-action-xml_move_item_up.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb1b688e5ecb78a917f957c5c1e227195945bca GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|nfKQ0) z|NsAi%+N!Z>wpwvNswQ#gPGOLZy-*Rx4R2N2dk_Hki%Kv5n0T@z%2;EjP)t;6M=&4 zC7!;n>=!ttImEPIU6u3)3dwuAIEGZrNltKJ?cwD)!!B_{-rz%h!i4_^6aKUN$}v<` Wvexc@`TQMFDTAl0pUXO@geCw55-^Sc literal 0 HcmV?d00001 diff --git a/part/icons/lo16-app-kxmleditor.png b/part/icons/lo16-app-kxmleditor.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8c3f2007c2c6809310709a22a023b52326be64 GIT binary patch literal 251 zcmVNtR#J|oJ73}0RM)I2!Y^|7you${iZPysya0TQ&N>^A!3F>T002ovPDHLkV1kRk BX$k-U literal 0 HcmV?d00001 diff --git a/part/icons/lo32-app-kxmleditor.png b/part/icons/lo32-app-kxmleditor.png new file mode 100644 index 0000000000000000000000000000000000000000..be1dac8a6af2f67a0e3cfefdd26688743996b19c GIT binary patch literal 578 zcmV-I0=@l-P)kWmH?FHjQRYTmzUKb#Atxe#$vG$fZc310KE{&09@pGem##t zBnNO1&XEuzIe;-nNGYw9GCCc}0WOz|1%#B+#+*nBuv)D+9*+S2USa{VEJG<}lLG8^ zyX#!HPGF3ou4@3a*6F4|%HOs-ZuSN#Whd`jDu7tH&CG}RuK+&8a=CmAK!|mB%=+fj zm+x=ulK^7k00l+#df$DM0Ng{YEjl6=%Q_J3eDCrDh=jHn(`z;uBLmGgf(q5P(0KRw(BB=v0@v!nQcc8Drq3fOlqr0Fi zXI))mkWymIJMuEan0F}aHn|RNuH#2Q-1~d3l(JctjpZB_KeXmgmZ7!g9}&S2LIlF# Q%K!iX07*qoM6N<$f}NNLfB*mh literal 0 HcmV?d00001 diff --git a/part/kxe_treeview.cpp b/part/kxe_treeview.cpp new file mode 100644 index 0000000..f5bd08c --- /dev/null +++ b/part/kxe_treeview.cpp @@ -0,0 +1,909 @@ +/*************************************************************************** + kxe_treeview.cpp - description + ------------------- + begin : Thu Sep 20 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : OleBowle@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxe_treeview.h" +#include "kxe_treeviewitem.h" +#include "kxesearchdialog.h" +#include "kxmleditorpart.h" + +#include "kxmleditorfactory.h" +#include "kxeconfiguration.h" +#include "kxetreeviewsettings.h" + +#include +#include +#include +#include +#include +#include +#include + +// include files for Qt +#include "qdom_add.h" +#include +#include +#include +#include +#include +#include + +static const int autoOpenTimeout = 750; + + +KXE_TreeView::KXE_TreeView( KXMLGUIClient * pGUIClient, QWidget * pParent, const char * pszName ) + : KListView(pParent,pszName), + m_pGUIClient(pGUIClient), + m_nBookmarkedItems(0) +{ + setSorting(-1); // no sorting + + addColumn(i18n("Qualified name")); + + setSelectionMode(QListView::Single); + + connect( this, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()) ); + connect( this, SIGNAL(expanded(QListViewItem*)), this, SLOT(slotItemExpanded(QListViewItem*)) ); + + setReadWrite(false); + + m_bDrag = false; + m_pCurrentBeforeDropItem = 0; + m_pDropItem = 0; + + m_autoOpenTimer = new QTimer(this); + connect(m_autoOpenTimer, SIGNAL(timeout()), this, SLOT(slotAutoOpenFolder())); + + // Apply current configuration + slotTreeViewSettingsChanged(); + // and make sure to be informed about its changes. + connect( KXMLEditorFactory::configuration()->treeview(), SIGNAL(sigChanged()), this, SLOT(slotTreeViewSettingsChanged()) ); +} + +void KXE_TreeView::setReadWrite( bool fReadWrite ) +{ + setItemsRenameable( fReadWrite ); + setRenameable( 0, fReadWrite ); + + if ( fReadWrite ) // If the widget enters read/write mode, then enable/disable + { // dropping (according to the configuration data). + setAcceptDrops( KXMLEditorFactory::configuration()->treeview()->enableDropping() ); + viewport()->setAcceptDrops( KXMLEditorFactory::configuration()->treeview()->enableDropping() ); + } + else // If the widget enter read only mode, + { // then disable dropping. + setAcceptDrops( false ); + viewport()->setAcceptDrops( false ); + } +} + +////////////////////////////////////////////////////////////// +// configuration slots +////////////////////////////////////////////////////////////// + +void KXE_TreeView::slotTreeViewSettingsChanged() +{ + setRootIsDecorated( KXMLEditorFactory::configuration()->treeview()->decorateRoot() ); + + if ( KXMLEditorFactory::configuration()->treeview()->elemDisplMode() == KXETreeViewSettings::NoAttributes ) + { + if ( columns() > 1 ) + removeColumn(1); + } + else + { + if ( columns() < 2 ) + addColumn( i18n("Attributes") ); + } + + KXE_TreeViewItem * pItem = static_cast (firstChild()); + while (pItem) + { + pItem->setTexts(); + pItem = pItem->nextItem(); + } + + if ( itemsRenameable() ) // If the widget is in read/write mode, then enable/disable + { // dropping (according to the configuration data). + setAcceptDrops( KXMLEditorFactory::configuration()->treeview()->enableDropping() ); + viewport()->setAcceptDrops( KXMLEditorFactory::configuration()->treeview()->enableDropping() ); + } + +} + +////////////////////////////////////////////////////////////// +// action slots +////////////////////////////////////////////////////////////// + +void KXE_TreeView::editDeselect() +{ + clearSelection(); +} + +void KXE_TreeView::viewNodeUp() +{ + // get selected item from tree view + QListViewItem * pSelItem = selectedItem(); + if ( ! pSelItem ) + { + kdDebug() << "KXE_TreeView::slotViewNodeUp no item selected" << endl; + return; + } + + // get parent item + QListViewItem * pParentItem = pSelItem->parent(); + + // select parent item in tree view + if (pParentItem) + { + setCurrentItem(pParentItem); + ensureItemVisible(pParentItem); + } +} + +void KXE_TreeView::viewExpNode( int nLevel ) +{ + // get selected item from tree view (if any) + QListViewItem * pSelItem = selectedItem(); + if ( ! pSelItem ) + { + kdDebug() << "KXE_TreeView::slotViewExpNode no item selected" << endl; + return; + } + + // expand node + KXE_TreeViewItem * pSelTreeItem = static_cast (pSelItem); + pSelTreeItem->expandSubTree(nLevel); +} + +void KXE_TreeView::viewColNode( int nLevel ) +{ + // get selected item from tree view (if any) + QListViewItem * pSelItem = selectedItem(); + if ( ! pSelItem ) + { + kdDebug() << "KXE_TreeView::slotViewColNode no item selected" << endl; + return; + } + + // expand node + KXE_TreeViewItem * pSelTreeItem = static_cast (pSelItem); + pSelTreeItem->collapseSubTree(nLevel); +} + +void KXE_TreeView::bookmarksToggle() +{ + // get selected item from tree view + KXE_TreeViewItem * pSelItem = static_cast (selectedItem()); + if ( ! pSelItem ) + { + kdDebug() << "KXE_TreeView::bookmarksToggle: no item selected" << endl; + return; + } + + // toggle bookmark on selected item + if(pSelItem->toggleBookmark()) + m_nBookmarkedItems++; + else + m_nBookmarkedItems--; +} + +void KXE_TreeView::bookmarksPrev() +{ + if ( childCount() < 1 ) + { + kdDebug() << "KXE_TreeView::bookmarksPrev: internal error - this tree view is empty" << endl; + return; + } + + // get selected item from tree view + KXE_TreeViewItem * pSelItem = static_cast (selectedItem()); + if ( ! pSelItem ) // If there is no item selected we take + { // the last root items last grand child. + QListViewItem * pTmpItem = firstChild(); // Take first child and + while ( pTmpItem->nextSibling() ) // find last child by + pTmpItem = pTmpItem->nextSibling(); // traversing all childs + + pSelItem = static_cast (pTmpItem); // this is the last root item + while ( pSelItem->lastChild() ) // find its last + pSelItem = pSelItem->lastChild(); // grand child + + if ( pSelItem->isBookmarked() ) // We have to check its + { // bookmarked-status + selectItem(pSelItem); // and select it, in case + return; // it is bookmarked. + } + } + + // Search items above the selected one + while ( (pSelItem = pSelItem->prevItem()) != 0 ) + { + if ( pSelItem->isBookmarked() ) + { + selectItem(pSelItem); + return; + } + } +} + +void KXE_TreeView::bookmarksNext() +{ + if ( childCount() < 1 ) + { + kdDebug() << "KXE_TreeView::bookmarksNext: internal error - this tree view is empty" << endl; + return; + } + + // get selected item from tree view + KXE_TreeViewItem * pSelItem = static_cast (selectedItem()); + if ( ! pSelItem ) + { // If there is no item selected + pSelItem = static_cast (firstChild()); // we take the first root item, + if ( pSelItem->isBookmarked() ) // but we have to check its + { // bookmarked-status + selectItem(pSelItem); // and select it, in case + return; // it is bookmarked. + } + } + + // Search items below the selected one + while ( (pSelItem = pSelItem->nextItem()) != 0 ) + { + if ( pSelItem->isBookmarked() ) + { + selectItem(pSelItem); + return; + } + } +} + +void KXE_TreeView::selectItem( KXE_TreeViewItem * const pItem ) +{ + if ( ! pItem ) + { + kdDebug() << "KXE_TreeView::selectItem: the given pointer is a null pointer" << endl; + return; + } + + setSelected( pItem, true ); + setCurrentItem( pItem ); + ensureItemVisible( pItem ); +} + +bool KXE_TreeView::selectNode( const QDomNode & node ) +{ + if ( node.isNull() ) + { + kdError() << "KXE_TreeView::selectNode: the given node is an empty one" << endl; + return false; + } + + KXE_TreeViewItem * pItem = findCorrespondingItem(node); + + if ( ! pItem ) // can't find the corresponding item + { + kdError() << "KXE_TreeView::selectNode can't find an item to the given node." << endl; + return false; + } + + selectItem(pItem); + return true; +} + +QDomNode * KXE_TreeView::getSelectedNode() const +{ + // get selected item from tree view + QListViewItem * pSelItem = selectedItem(); + if ( ! pSelItem ) + return 0; + + KXE_TreeViewItem * pSelTreeItem = static_cast (pSelItem); + return pSelTreeItem->xmlNode(); +} + +QDomNode * KXE_TreeView::getSpecProcInstrNode(const QString& target) const +{ + KXE_TreeViewItem * pTreeItem = static_cast (firstChild()); + while ( pTreeItem ) + { + if (pTreeItem->xmlNode()->isProcessingInstruction()) + { + QDomProcessingInstruction domProcInstr = pTreeItem->xmlNode()->toProcessingInstruction(); + if(domProcInstr.target() == target) + return pTreeItem->xmlNode(); + } + + pTreeItem = pTreeItem->nextItem(); + } + + return 0; +} + +// Return info, is root element is already created +bool KXE_TreeView::hasRootNode() +{ + KXE_TreeViewItem * pTreeItem = static_cast (firstChild()); + while ( pTreeItem ) + { + if (pTreeItem->xmlNode()->isElement()) + { + return true; + } + + pTreeItem = pTreeItem->nextItem(); + } + + return false; +} + + +QString KXE_TreeView::getSelectedPath() const +{ + // get selected item from tree view + QListViewItem * pSelItem = selectedItem(); + if ( ! pSelItem ) + return QString(); + + KXE_TreeViewItem * pSelTreeItem = static_cast (pSelItem); + return domTool_getPath( * pSelTreeItem->xmlNode() ); +} + +void KXE_TreeView::contentsMousePressEvent( QMouseEvent * pEvent ) +{ + KListView::contentsMousePressEvent(pEvent); + + if ( pEvent->button() == RightButton ) + { + QString szMenuName; + + QListViewItem * pItem = itemAt( contentsToViewport(pEvent->pos()) ); + if (pItem) + { + KXE_TreeViewItem * pTreeItem = static_cast (pItem); + switch( pTreeItem->xmlNode()->nodeType() ) + { + case QDomNode::ElementNode: + szMenuName = "popupXmlElement"; + break; + case QDomNode::TextNode: + case QDomNode::CDATASectionNode: + case QDomNode::CommentNode: + szMenuName = "popupXmlContent"; + break; + case QDomNode::ProcessingInstructionNode: + szMenuName = "popupXmlProcInstr"; + break; + default: + kdDebug() << "KXE_TreeView::contentsMousePressEvent unknown item type" << endl; + return; + } + } + else + szMenuName = "popupXmlTree"; + + emit sigContextMenuRequested( szMenuName, QCursor::pos() ); + return; + } + + //--- Drag & Drop ------------------------------------------------------ + QPoint p(contentsToViewport(pEvent->pos())); + QListViewItem *i = itemAt(p); + + if(pEvent->button() == LeftButton && i) + { // if the user clicked into the root decoration of the item, don't try to start a drag! + if(p.x() > header()->cellPos(header()->mapToActual(0)) + + treeStepSize() * ( i->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin() || + p.x() < header()->cellPos(header()->mapToActual(0))) + { + m_dragPos = pEvent->pos(); + m_bDrag = true; + } + } +} + +void KXE_TreeView::slotSelectionChanged() +{ + KXE_TreeViewItem * pItem = static_cast (selectedItem()); + + if ( ! pItem ) + emit sigSelectionCleared(hasRootNode()); + else + { + QDomNode selectedNode = * ( pItem->xmlNode() ); // uses QDomNode copy constructor + + // choose appropriate object kind + switch ( selectedNode.nodeType() ) + { + case QDomNode::ElementNode: + emit sigSelectionChanged( selectedNode.toElement()); + break; + + case QDomNode::TextNode: + case QDomNode::CDATASectionNode: + case QDomNode::CommentNode: + emit sigSelectionChanged( selectedNode.toCharacterData()); + break; + + case QDomNode::ProcessingInstructionNode: + emit sigSelectionChanged( selectedNode.toProcessingInstruction()); + break; + + default: + kdDebug() << "KXE_TreeView::slotSelectionChanged unknown object type selected" << endl; + return; + } + } +} + + +void KXE_TreeView::slotItemExpanded( QListViewItem * pItem ) +{ + KXE_TreeViewItem * pTreeViewItem = static_cast (pItem); + pTreeViewItem->ensureGrandChildItemsCreated(); +} + + +////////////////////////////////////////////////////////////// +// update slots +////////////////////////////////////////////////////////////// + +void KXE_TreeView::updateNodeCreated( const QDomNode & node ) +{ + if ( node.isNull() ) + { + kdError() << "KXE_TreeView::slotUpdateNodeCreated the given node is an empty one." << endl; + return; + } + + KXE_TreeViewItem * pNewItem; + if ( node.parentNode().isDocument() ) // the new nodes parent is the document itself, + { + // so we have to create a root item. + // Now it depends: either it's a processing instruction, or element + if (node.isProcessingInstruction()) + // Tree looks much nicer if root processing instructions are ont the top... + { + QDomNode *pNode = getSpecProcInstrNode("xml"); + if (pNode) + pNewItem = new KXE_TreeViewItem( node, this,findCorrespondingItem(*pNode)); + else + pNewItem = new KXE_TreeViewItem( node, this); + } + else + // ...and root element is placed at the bottom. + pNewItem = new KXE_TreeViewItem( node, this,lastChild()); +// pNewItem = new KXE_TreeViewItem( node, this); + + if ( ! rootIsDecorated() ) + pNewItem->setOpen(true); + } + else + { + if ( node.parentNode().isNull() ) + { + kdError() << "KXE_TreeView::slotUpdateNodeCreated the given node has no parent node (but should)." << endl; + return; + } + + // To create the new item, we need (1st) the item corresponding to the parent node of the given one. + QDomNode parentNode = node.parentNode(); + // Because the currently selected item is very likely (in many cases) the correct one, try it first. + KXE_TreeViewItem * pParentItem = static_cast (selectedItem()); + if ( (!pParentItem) || ( *(pParentItem->xmlNode()) != parentNode ) ) + { // no strike :-( + pParentItem = findCorrespondingItem(parentNode); // do it the "long" way + } + + if ( ! pParentItem ) // can't find the corresponding item + { + kdError() << "KXE_TreeView::slotUpdateNodeCreated can't find an item to the given nodes parent node." << endl; + return; + } + + // Now we need (2nd) the item corresponding to the previous sibling of the given one, + // because, the new item has to be inserted behind the given one. + QDomNode prevNode = node.previousSibling(); + if ( prevNode.isNull() ) + { // it seems to be the first child node, so create a first child item + pNewItem = new KXE_TreeViewItem( node, pParentItem ); + } + else + { + KXE_TreeViewItem * pPrevItem = findCorrespondingItem(prevNode); + if ( ! pParentItem ) // can't find the corresponding item :-( + { + kdError() << "KXE_TreeView::slotUpdateNodeCreated can't find an item to the given nodes previous sibling." << endl; + return; + } + // everything's alright, let's create the new item + pNewItem = new KXE_TreeViewItem( node, pParentItem, pPrevItem ); + } + + } + + setSelected( pNewItem, true ); + ensureItemVisible( pNewItem ); +} + +void KXE_TreeView::updateNodeChanged( const QDomNode & node ) +{ + if ( node.isNull() ) + { + kdError() << "KXE_TreeView::slotUpdateNodeChanged the given node is an empty one." << endl; + return; + } + + // To change the item, we have to find it. + // Because the currently selected item is very likely (in many cases) the correct one, try it first. + KXE_TreeViewItem * pItem = static_cast (selectedItem()); + if ( (!pItem) || ( *(pItem->xmlNode()) != node ) ) // no strike :-( + pItem = findCorrespondingItem(node); // do it the "long" way + + if ( ! pItem ) // can't find the corresponding item + { + kdError() << "KXE_TreeView::slotUpdateNodeChanged can't find an item to the given node." << endl; + return; + } + + pItem->setTexts(); // update the item + + setSelected( pItem, true ); + ensureItemVisible( pItem ); +} + +void KXE_TreeView::updateNodeDeleted( const QDomNode & node ) +{ + if ( node.isNull() ) + { + kdError() << "KXE_TreeView::slotUpdateNodeDeleted the given node is an empty one." << endl; + return; + } + + // To remove the item, we have to find it. + // Because the currently selected item is very likely (in many cases) the correct one, try it first. + KXE_TreeViewItem * pItem = static_cast (selectedItem()); + if ( (!pItem) || ( *(pItem->xmlNode()) != node ) ) // no strike :-( + pItem = findCorrespondingItem(node); // do it the "long" way + + if ( ! pItem ) // can't find the corresponding item + { + kdError() << "KXE_TreeView::slotUpdateNodeDeleted can't find an item to the given node." << endl; + return; + } + + clearSelection(); + + delete pItem; + + emit sigSelectionCleared(hasRootNode()); +} + +void KXE_TreeView::updateNodeMoved( const QDomNode & node ) +{ + if ( node.isNull() ) + { + kdError() << "KXE_TreeView::slotUpdateNodeMoved the given node is an empty one." << endl; + return; + } + + // To move the item, we have to find it. + // Because the currently selected item is very likely (in many cases) the correct one, try it first. + KXE_TreeViewItem * pItem = static_cast (selectedItem()); + if ( (!pItem) || ( *(pItem->xmlNode()) != node ) ) // no strike :-( + pItem = findCorrespondingItem(node); // do it the "long" way + + if ( ! pItem ) // can't find the corresponding item + { + kdError() << "KXE_TreeView::slotUpdateNodeMoved can't find an item to the given node." << endl; + return; + } + + // Now we can move the item (of the moved node). + // We have to differenciate between the following 2 cases. + if ( node.previousSibling().isNull() ) + { + // The node does not has a previous sibling. This means, it has been moved + // to be its parent first child. In this case, we have to find the tree + // view item of the node's next sibling to swap them. + // It's very likely the previous sibling of the item corresponding to the + // moved node. + KXE_TreeViewItem * pOldPrevItem = pItem->prevSibling(); + // Was it really? + if ( ! pOldPrevItem || ( *(pOldPrevItem->xmlNode()) != node.nextSibling() ) ) + // It wasn't (how can it be?) - we have to find it using the "long" way. + pOldPrevItem = findCorrespondingItem( node.nextSibling() ); + + if ( ! pOldPrevItem ) // something went wrong + { + kdError() << "KXE_TreeView::slotUpdateNodeMoved can't find the item to the given node's next sibling." << endl; + return; + } + + // Now we can swap them (make the old previous item the new next item of + // the moved node's item). + pOldPrevItem->moveItem( pItem ); + } + else + { + // The node has a previous sibling. In this case we have to find the + // corresponding tree view item to swap it with the item corresponding to + // the moved node. + KXE_TreeViewItem * pNewPrevItem = findCorrespondingItem( node.previousSibling() ); + if ( ! pNewPrevItem ) + { + kdError() << "KXE_TreeView::slotUpdateNodeMoved can't find the new prev.item to the given nodes prev.node." << endl; + return; + } + + // swap them (move the moved node's item after the previous sibling's item) + pItem->moveItem( pNewPrevItem ); + } + + setSelected( pItem, true ); + ensureItemVisible( pItem ); +} + +void KXE_TreeView::updateClear() +{ + clear(); +} + +void KXE_TreeView::rename( QListViewItem * pItem, int nColumn ) +{ + if ( nColumn != 0 ) // inplace editing only + return; // for the first column + + KXE_TreeViewItem * pXMLItem = static_cast (pItem); + if ( pXMLItem->xmlNode()->isElement() ) // inplace-renaming only for items representing XML elements + KListView::rename( pItem, nColumn ); // inplace-renaming via base class functionality + + else if(pXMLItem->xmlNode()->isCharacterData()) // launch dialog for editing text nodes + (dynamic_cast (m_pGUIClient))->slotXmlCharDataEdit(); + + else if(pXMLItem->xmlNode()->isProcessingInstruction()) // launch dialog for editing proc.instr. + (dynamic_cast (m_pGUIClient))->slotXmlProcInstrEdit(); +} + +////////////////////////////////////////////////////////////// +// misc functions +////////////////////////////////////////////////////////////// + +KXE_TreeViewItem * KXE_TreeView::findCorrespondingItem( const QDomNode & node ) +{ + KXE_TreeViewItem * pItem = static_cast (firstChild()); + while ( pItem ) + { + if ( *(pItem->xmlNode()) == node ) + return pItem; + pItem = pItem->nextItem(); + } + + return 0; +} + +////////////////////////////////////////////////////////////// +// Drag & Drop +////////////////////////////////////////////////////////////// + +/** Overrides KListView::contentsMouseMoveEvent */ +void KXE_TreeView::contentsMouseMoveEvent(QMouseEvent *e) +{ + KListView::contentsMouseMoveEvent(e); + + // exit, if dragging is disabled + if ( ! KXMLEditorFactory::configuration()->treeview()->enableDragging() ) + return; + + if(!m_bDrag || (e->pos() - m_dragPos).manhattanLength() <= KGlobalSettings::dndEventDelay()) + return; + + m_bDrag = false; + + QListViewItem *item = itemAt(contentsToViewport(m_dragPos)); + + if(!item || !item->isSelectable()) + return; + + // copy item into clipboard + KXE_TreeViewItem *pXmlTreeItem = static_cast (item); + QTextDrag *pDrag = (dynamic_cast (m_pGUIClient))->copyNode(pXmlTreeItem->xmlNode()); + + + // Start a drag + const QPixmap *pix = item->pixmap(0); + if(pix && pDrag->pixmap().isNull()) + { QPoint hotspot(pix->width() / 2, pix->height() / 2); + pDrag->setPixmap(*pix, hotspot); + } + + pDrag->drag(); +} + +/** Overrides KListView::contentsMouseReleaseEvent */ +void KXE_TreeView::contentsMouseReleaseEvent(QMouseEvent *e) +{ + KListView::contentsMouseReleaseEvent(e); + m_bDrag = false; +} + +/** Overrides QScrollView::contentsDragEnterEvent */ +void KXE_TreeView::contentsDragEnterEvent(QDragEnterEvent *e) +{ + m_pDropItem = 0; + m_pCurrentBeforeDropItem = selectedItem(); + + // Save the available formats + m_lstDropFormats.clear(); + for(int i = 0; e->format(i); i++) + { if(*(e->format(i))) + { m_lstDropFormats.append(e->format(i)); + } + } +} + +/** Overrides QScrollView::contentsDragMoveEvent */ +void KXE_TreeView::contentsDragMoveEvent(QDragMoveEvent *e) +{ + QListViewItem *item = itemAt(contentsToViewport(e->pos())); + + // Accept drops on the background, if Texts + if(!item && (m_lstDropFormats.contains("text/"))) + { m_pDropItem = 0; + e->acceptAction(); + if(selectedItem()) + setSelected(selectedItem(), false); // no item selected + return; + } + + if(!item || !item->isSelectable()) + { m_pDropItem = 0; + m_autoOpenTimer->stop(); + e->ignore(); + return; + } + + e->acceptAction(); + + setSelected(item, true); + + if(item != m_pDropItem ) + { m_autoOpenTimer->stop(); + m_pDropItem = item; + m_autoOpenTimer->start(autoOpenTimeout); + } +} + +/** Overrides QScrollView::contentsDragLeaveEvent */ +void KXE_TreeView::contentsDragLeaveEvent(QDragLeaveEvent *e) +{ + e=e; + // Restore the current item to what it was before the dragging (#17070) + if(m_pCurrentBeforeDropItem) + setSelected(m_pCurrentBeforeDropItem, true); + else + setSelected(m_pDropItem, false); // no item selected + + m_pCurrentBeforeDropItem = 0; + m_pDropItem = 0; + m_lstDropFormats.clear(); +} + +/** Overrides QScrollView::contentsDropEvent */ +void KXE_TreeView::contentsDropEvent(QDropEvent *pDropEvent) +{ + m_autoOpenTimer->stop(); + + drop(selectedItem(), pDropEvent); +} + +/** Called, when m_autoOpenTimer timeout occured */ +void KXE_TreeView::slotAutoOpenFolder() +{ + m_autoOpenTimer->stop(); + + if(!m_pDropItem || m_pDropItem->isOpen()) + return; + + m_pDropItem->setOpen( true ); + m_pDropItem->repaint(); +} + +/** Drop or paste text into item */ +bool KXE_TreeView::drop(QListViewItem *pItem, QDropEvent *pDropEvent) +{ + KXE_TreeViewItem* pTreeItem = 0; + if(pItem) + pTreeItem = static_cast (pItem); + + QDomNode *pTargetNode = pTreeItem->xmlNode(); + + // First, make check, if moved item is not moved to their children + if((pDropEvent->source() == this) && (pDropEvent->action() == QDropEvent::Move)) + { // make check, if moved item is not moved to itself + if(m_pCurrentBeforeDropItem && pTreeItem && (m_pCurrentBeforeDropItem == pTreeItem)) + { return false; + } + + if(m_pCurrentBeforeDropItem && pTreeItem && + static_cast (m_pCurrentBeforeDropItem)->isMyChildren(pTreeItem)) + { KMessageBox::sorry(0, i18n("An XML element can't be moved to its own subtree.")); + return false; + } + + if (pTreeItem->xmlNode()->isProcessingInstruction()) + { + KMessageBox::sorry(0, i18n("An XML node can't be moved in a processing instruction.")); + return false; + } + + QDomNode * pNode = static_cast (m_pCurrentBeforeDropItem)->xmlNode(); + if (pNode->isProcessingInstruction()) + { + QDomProcessingInstruction domProcInstr = pNode->toProcessingInstruction(); + + if(domProcInstr.target() == "xml") + { KMessageBox::sorry(0, i18n("This processing instruction cannot be moved !")); + return false; + } + } + } + + //-- If Move from same instance of this widget + if((pDropEvent->source() == this) && (pDropEvent->action() == QDropEvent::Move) && (m_pCurrentBeforeDropItem) && pTargetNode->isElement()) + { + // remove source item + QDomNode * pSourceNode = static_cast (m_pCurrentBeforeDropItem)->xmlNode(); + QDomElement domTargetElement = pTargetNode->toElement(); + + if((dynamic_cast (m_pGUIClient))->dropMoveNode(domTargetElement, *pSourceNode)) + { + pDropEvent->acceptAction(); + return true; + } + } + else + { + //-- If Copy, do standart Paste function + if((dynamic_cast (m_pGUIClient))->pasteNode(pTargetNode, pDropEvent)) + { + pDropEvent->acceptAction(); + return true; + } + } + return false; +} + + +// +// returns last child on the tree (top-level) +// +KXE_TreeViewItem* KXE_TreeView::lastChild() +{ + QListViewItem* pItem = firstChild(); + if (pItem && pItem->nextSibling()) + do + pItem = pItem->nextSibling(); + while (pItem->nextSibling()); + + // here we have it... + return (KXE_TreeViewItem*) pItem; +} + +void KXE_TreeView::keyPressEvent(QKeyEvent *e) +{ + KListView::keyPressEvent(e); + emit sigKeyPressed(e); +} diff --git a/part/kxe_treeview.h b/part/kxe_treeview.h new file mode 100644 index 0000000..0ba2c86 --- /dev/null +++ b/part/kxe_treeview.h @@ -0,0 +1,235 @@ +/*************************************************************************** + kxe_treeview.h - description + ------------------- + begin : Thu Sep 20 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : OleBowle@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXE_TREEVIEW_H +#define KXE_TREEVIEW_H + +#include +#include + +class KXESearchDialog; + +class QDomDocument; +class QDomNode; +class QDomElement; +class QDomCharacterData; +class QDomProcessingInstruction; + +class QMouseEvent; +class QTimer; +class QKeyEvent; +class KXMLGUIClient; +class KXE_TreeViewItem; + +/** + * This is a listview, which displays the XML tree structure. + * @short shows XML tree + */ +class KXE_TreeView : public KListView +{ + Q_OBJECT + +public: + KXE_TreeView( KXMLGUIClient * pGUIClient, QWidget * pParent = 0, const char * pszName = 0 ); + + /** Changes the behaviour of this view to readonly or readwrite. */ + void setReadWrite( bool fReadWrite ); + + /** Selects the given item. */ + void selectItem( KXE_TreeViewItem * const pItem ); + + /** Selects the item corresponding to the given node. + * Returns true on success, false otherwise. */ + bool selectNode( const QDomNode & node ); + + /** Returns the a pointer to the selected items node or a null pointer (if no item is selected). */ + QDomNode * getSelectedNode() const; + + /** Returns the a pointer to the special processing instruction or a null pointer for (if no item is exists). */ + QDomNode * getSpecProcInstrNode(const QString& target) const; + + /** Returns the selected items path or an empty string, if no item is selected. */ + QString getSelectedPath() const; + + /** Returns true, if this tree view contains bookmarked tree items and false otherwise. */ + bool containsBookmarkedItems() const { return (m_nBookmarkedItems>0); } + + /** Drop or paste text into item */ + bool drop(QListViewItem *, QDropEvent *); + + /** toggles bookmark on the selected item */ + void bookmarksToggle(); + + /** searches for the next bookmarked item */ + void bookmarksPrev(); + + /** searches for the previous bookmarked item */ + void bookmarksNext(); + + /** deselects currently selected item */ + void editDeselect(); + + /** Selects the selected item's parent item. */ + void viewNodeUp(); + + /** Expands the selected tree item's subtree to the given level (see @ref KXE_TreeViewItem::expandSubTree). */ + void viewExpNode( int nLevel ); + + /** Collapses the selected tree item's subtree to the given level (see @ref KXE_TreeViewItem::collapseSubTree). */ + void viewColNode( int nLevel ); + + /** + * Creates new item(s) to the given node (and its child nodes) + * and inserts it (or them) in the tree. + */ + void updateNodeCreated( const QDomNode & node ); + + /** Changes the item corresponding to the given node. */ + void updateNodeChanged( const QDomNode & node ); + + /** Removes the item corresponding to the given node. */ + void updateNodeDeleted( const QDomNode & node ); + + /** Moves the item corresponding to the given node. */ + void updateNodeMoved( const QDomNode & node ); + + /** Clears the whole tree. */ + void updateClear(); + + /** + * Handles inplace-renaming of items, because in our case + * only items representing XML elements are to be renameable. + * For the actual renaming of the items text, the base + * class functionality is used and the signal + * @ref sigItemRenamedInplace emitted. + */ + virtual void rename( QListViewItem * pItem, int nColumn ); + + /** Returns info, is root element is already created */ + bool hasRootNode(); + /** Returns last top-level child on the tree. If there are no chold in the tree, null is returned. */ + KXE_TreeViewItem* lastChild(); + +public slots: + + // configuration slots + ////////////////////////////////////////////////////////////// + + /** + * Changes this tree view's settings according to the current + * configuration. + */ + void slotTreeViewSettingsChanged(); + +signals: + /** emitted, when no item is selected */ + void sigSelectionCleared(bool); + + /** emitted, when an XML element item is selected */ + void sigSelectionChanged( const QDomElement & ); + + /** emitted, when an XML Content item is selected */ + void sigSelectionChanged( const QDomCharacterData & ); + + /** emitted, when an XML proc.instr. item is selected */ + void sigSelectionChanged( const QDomProcessingInstruction & ); + + /** + * Signals the change of bookmark status. + * true - item(s) bookmarked + * false - no item bookmarked + */ + void sigNewBookmarkStatus( bool fStatus ); + + /** Emitted, when a context menu is requested */ + void sigContextMenuRequested( const QString & szMenuName, const QPoint & pos ); + /** Emitted when user presses a key. */ + void sigKeyPressed(QKeyEvent* e); + +protected: + /** if RMB shows the popupmenu corresponding to the selected item */ + void contentsMousePressEvent( QMouseEvent * ); + + /** Finds the corresponding treeview item to the given node. */ + KXE_TreeViewItem * findCorrespondingItem( const QDomNode & node ); + + /** Overrides KListView::contentsMouseReleaseEvent */ + void contentsMouseReleaseEvent(QMouseEvent *); + + /** Overrides KListView::contentsMouseMoveEvent */ + void contentsMouseMoveEvent(QMouseEvent *); + + /** Overrides QScrollView::contentsDragEnterEvent */ + void contentsDragEnterEvent(QDragEnterEvent *); + + /** Overrides QScrollView::contentsDragMoveEvent */ + void contentsDragMoveEvent(QDragMoveEvent *); + + /** Overrides QScrollView::contentsDragLeaveEvent */ + void contentsDragLeaveEvent(QDragLeaveEvent *); + + /** Overrides QScrollView::contentsDropEvent */ + void contentsDropEvent(QDropEvent *); + virtual void keyPressEvent(QKeyEvent *e); + +protected slots: + /** Checks, which type of item was selected an emits the corresponding signal. */ + void slotSelectionChanged(); + /** + * Ensures that the expanded item's grandchild items are created. + * This is very important for the "create items on demand" mode. But even in + * "create all items while loading" mode, this function has to be executed, + * because KXMLEditor could have been in "create items on demand" mode during + * the opening of the document. + * + * To be connected to the signal QListView::expanded(QListViewItem*). + */ + void slotItemExpanded( QListViewItem * ); + +private slots: + + /** Called, when m_autoOpenTimer timeout occured */ + void slotAutoOpenFolder(); + +protected: + + /** the GUI client, needed for the popupmenus */ + KXMLGUIClient * m_pGUIClient; + + /** number of bookmarked items */ + unsigned int m_nBookmarkedItems; + + /** True if drag&drop operation started, otherwise is false */ + bool m_bDrag; + + /** Contain mouse position of drag operation */ + QPoint m_dragPos; + + /** The item that was current before the drag-enter event happened */ + QListViewItem *m_pCurrentBeforeDropItem; + + /** The item we are moving the mouse over (during a drag) */ + QListViewItem *m_pDropItem; + + /** List of avalilable drop formats */ + QStrList m_lstDropFormats; + + /** Timer for counting time to auto open fselected folder while drag */ + QTimer *m_autoOpenTimer; +}; + +#endif diff --git a/part/kxe_treeviewitem.cpp b/part/kxe_treeviewitem.cpp new file mode 100644 index 0000000..0107bee --- /dev/null +++ b/part/kxe_treeviewitem.cpp @@ -0,0 +1,330 @@ +/*************************************************************************** + kxe_treeviewitem.cpp - description + ------------------- + begin : Wed Nov 21 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxe_treeviewitem.h" + +#include "kxmleditorfactory.h" +#include "kxeconfiguration.h" +#include "kxetreeviewsettings.h" + +#include "qdom_add.h" + +#include + +#include +#include +#include + +KXE_TreeViewItem::KXE_TreeViewItem( const QDomNode & xmlNode, QListViewItem * pParent ) + : QListViewItem(pParent), + m_xmlNode(xmlNode), + m_pPrevSibling(0), + m_bBookmarked(false), + m_bChildsCreated(false), + m_bGrandChildsCreated(false) +{ + init(); + initChilds(); +} + +KXE_TreeViewItem::KXE_TreeViewItem( const QDomNode & xmlNode, KListView * pParent, QListViewItem* pAfter) + : QListViewItem(pParent,pAfter), + m_xmlNode(xmlNode), + m_pPrevSibling(0), + m_bBookmarked(false), + m_bChildsCreated(false), + m_bGrandChildsCreated(false) +{ + init(); + initChilds(); +} + +KXE_TreeViewItem::KXE_TreeViewItem( const QDomNode & xmlNode, QListViewItem * pParent, QListViewItem * pAfter ) + : QListViewItem( pParent, pAfter ), + m_xmlNode(xmlNode), + m_pPrevSibling(0), + m_bBookmarked(false), + m_bChildsCreated(false), + m_bGrandChildsCreated(false) +{ + init(); + initChilds(); +} + +KXE_TreeViewItem::~KXE_TreeViewItem() +{ + // inform the next sibling (if there's any) about destroying this item (as its previous sibling) + KXE_TreeViewItem * pNextItem = static_cast (nextSibling()); + if ( pNextItem ) + { pNextItem->setPrevSibling(m_pPrevSibling); + } +} + +void KXE_TreeViewItem::init() +{ + // A tree view item can only be in-place renameable, if it represents an XML element + // (the final check occurs in KXE_TreeViewItem::startRename). + if ( m_xmlNode.isElement() ) + setRenameEnabled( 0, true ); + + // inform the next sibling (if there's any) about this item (as its previous sibling) + KXE_TreeViewItem * pNextItem = static_cast (nextSibling()); + if ( pNextItem ) + pNextItem->setPrevSibling(this); + + setPixmap(0, domTool_getIconForNodeType(m_xmlNode.nodeType(), false)); + + if ( domTool_getLevel(m_xmlNode) < (unsigned int)KXMLEditorFactory::configuration()->treeview()->dfltExpLevel() ) + setOpen(true); + + setTexts(); +} + +void KXE_TreeViewItem::setTexts() +{ + switch ( m_xmlNode.nodeType() ) + { + case QDomNode::ElementNode: + + setText( 0, m_xmlNode.toElement().nodeName() ); + + if ( KXMLEditorFactory::configuration()->treeview()->elemDisplMode() == KXETreeViewSettings::NoAttributes ) + setText( 1, QString() ); + else + { + // parse all attributes to fill the second column + QString str2ndCol; + for ( uint i=0; i < m_xmlNode.toElement().attributes().length(); i++ ) + { + if ( i > 0 ) + str2ndCol += ", "; + str2ndCol += m_xmlNode.toElement().attributes().item(i).toAttr().name(); + if ( KXMLEditorFactory::configuration()->treeview()->elemDisplMode() == KXETreeViewSettings::NamesAndValues ) + str2ndCol += '=' + m_xmlNode.toElement().attributes().item(i).toAttr().value(); + } + setText( 1, str2ndCol ); + } + break; + + case QDomNode::TextNode: + case QDomNode::CDATASectionNode: + case QDomNode::CommentNode: + { + // set name + QString strText = m_xmlNode.toCharacterData().data(); + strText = strText.replace( QRegExp("\n"), " " ); // replace every newline by a space + strText = strText.replace( QRegExp("\t"), "" ); // removes every tab + strText = strText.replace( QRegExp("\r"), "" ); // removes every return + strText = strText.simplifyWhiteSpace(); + if( strText.length() > 30 ) // reduce name length, if necessary + strText = strText.left(30) + "..."; + setText( 0, strText ); + + break; + } + + case QDomNode::ProcessingInstructionNode: + + setText( 0, m_xmlNode.toProcessingInstruction().target() ); + break; + + default: + kdDebug() << "KXE_TreeViewItem::init: unknown node type (" << m_xmlNode.nodeType() << ")" << endl; + } +} + +void KXE_TreeViewItem::initChilds() +{ + if ( ! KXMLEditorFactory::configuration()->treeview()->createItemsOnDemand() || + ( ! m_bChildsCreated && + ( ! parent() || ( parent() && parent()->isOpen() ) ) + ) + ) + ensureChildItemsCreated(); +} + +bool KXE_TreeViewItem::toggleBookmark() +{ + m_bBookmarked = ! m_bBookmarked; + + setPixmap(0, domTool_getIconForNodeType(m_xmlNode.nodeType(), m_bBookmarked)); + + return m_bBookmarked; +} + +KXE_TreeViewItem * KXE_TreeViewItem::lastChild() const +{ + // take the first child + QListViewItem * pTmpItem = firstChild(); + // if there are no childs return 0 + if ( ! pTmpItem ) + return 0; + + QListViewItem * pTmpItem2; + while ( (pTmpItem2 = pTmpItem->nextSibling()) != 0 ) // traversing all childs + { + pTmpItem = pTmpItem2; + } + + return static_cast (pTmpItem); +} + +KXE_TreeViewItem * KXE_TreeViewItem::prevItem() +{ + if ( m_pPrevSibling ) // if there is a prev. sibling + { // return its last grand child (if there is any) + KXE_TreeViewItem * pPrevItem = m_pPrevSibling; + KXE_TreeViewItem * pTmpItem; + while ( (pTmpItem=pPrevItem->lastChild()) ) + pPrevItem = pTmpItem; + return pPrevItem; + } + else // if there is no prev. sibling, + return static_cast (parent()); // return this' parent (if there is any) +} + +KXE_TreeViewItem * KXE_TreeViewItem::nextItem() +{ + // checking for a child + QListViewItem * pTmp = firstChild(); + if (pTmp) + return static_cast (pTmp); + + // there is no child -> checking for the next sibling + pTmp = nextSibling(); + if (pTmp) + return static_cast (pTmp); + + // there is no next sibling -> checking for parents' next sibling(s) + QListViewItem * pParent = parent(); + while (pParent) + { + pTmp = pParent->nextSibling(); + if (pTmp) + return static_cast (pTmp); + pParent = pParent->parent(); + } + return 0; +} + +void KXE_TreeViewItem::expandSubTree( int iLevel ) +{ + setOpen(true); // expand this item + + if ( iLevel == 0 ) // return, if we are deep enough + return; + + // expand childs (recursive) + int iNewLevel = ( iLevel == -1 ) ? -1 : iLevel-1; + KXE_TreeViewItem * pChild = static_cast ( firstChild() ); + while ( pChild ) + { + pChild->expandSubTree(iNewLevel); + pChild = static_cast ( pChild->nextSibling() ); + } +} + +void KXE_TreeViewItem::collapseSubTree( int iLevel ) +{ + if ( iLevel < 0 ) + { + kdDebug() << "KXE_TreeViewItem::collapseSubTree: wrong level given (iLevel=" << iLevel << ")" << endl; + return; + } + + int iNewLevel; + if (iLevel==0) // collapse this item, + { // because we are deep enough + setOpen(false); + iNewLevel = 0; + } + else + iNewLevel = iLevel - 1; + + // collapsing in childs (recursive) + KXE_TreeViewItem * pChild = static_cast ( firstChild() ); + while ( pChild ) + { + pChild->collapseSubTree( iNewLevel ); + pChild = static_cast ( pChild->nextSibling() ); + } +} + +/** Test, if item in parameter is my direct or indirect child item */ +bool KXE_TreeViewItem::isMyChildren(const KXE_TreeViewItem *pTestItem) +{ + KXE_TreeViewItem* pChildXmlTreeItem = (KXE_TreeViewItem*) firstChild(); + while(pChildXmlTreeItem) + { if(pChildXmlTreeItem == pTestItem) + return true; + + // test child item childrens + if(pChildXmlTreeItem->isMyChildren(pTestItem)) + return true; + + pChildXmlTreeItem = (KXE_TreeViewItem*) pChildXmlTreeItem->nextSibling(); + } + return false; +} + + +void KXE_TreeViewItem::ensureChildItemsCreated() +{ + if ( ! m_bChildsCreated ) + { + QDomNode tmpNode = m_xmlNode.lastChild(); + + while ( ! tmpNode.isNull() ) + { + new KXE_TreeViewItem( tmpNode, this ); + tmpNode = tmpNode.previousSibling(); + } + + m_bChildsCreated = true; + } +} + + +void KXE_TreeViewItem::ensureGrandChildItemsCreated() +{ + if ( ! m_bGrandChildsCreated ) + { + // ensure, that all child items of this item are created + if ( ! m_bChildsCreated ) + ensureChildItemsCreated(); + + // Iterate over all children now and ensure their child items + // (this' grandchildrens) are created. + KXE_TreeViewItem * pChild = static_cast ( firstChild() ); + while ( pChild ) + { + pChild->ensureChildItemsCreated(); + pChild = static_cast ( pChild->nextSibling() ); + } + + m_bGrandChildsCreated = true; + } +} + +void KXE_TreeViewItem::startRename( int iCol ) +{ + // If the given column is set to be in-place renameable in this item's view, + // we can start renaming in-place. + // Remember: This function is only reached for items representing XML elements. + if ( (reinterpret_cast ( listView() ))->isRenameable( iCol ) ) + QListViewItem::startRename( iCol ); +} diff --git a/part/kxe_treeviewitem.h b/part/kxe_treeviewitem.h new file mode 100644 index 0000000..c24b99f --- /dev/null +++ b/part/kxe_treeviewitem.h @@ -0,0 +1,125 @@ +/*************************************************************************** + kxe_treeviewitem.h - description + ------------------- + begin : Wed Nov 21 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXE_TREEVIEWITEM_H +#define KXE_TREEVIEWITEM_H + +#include +#include +#include + +class KListView; + +/** + * This is a tree item, which represents one XML node (see @ref QDomNode and its childclasses). + * @short tree item + * @author The KXMLEditor Team + */ +class KXE_TreeViewItem : public QListViewItem +{ + public: + + KXE_TreeViewItem( const QDomNode & xmlNode, KListView * pParent, QListViewItem* pAfter=NULL); + KXE_TreeViewItem( const QDomNode & xmlNode, QListViewItem * pParent ); + KXE_TreeViewItem( const QDomNode & xmlNode, QListViewItem * pParent, QListViewItem * pAfter ); + ~KXE_TreeViewItem(); + + /** + * (Re)sets the texts of the columns of this listitem + * depending on type of corresponding XML node and + * element display mode, which is stored in the configuration + * (@ref KXETreeViewSettings::elemDisplMode). + */ + void setTexts(); + + /** Returns the corresponding XML node, e.g. the XML node represented by this tree item. */ + QDomNode * xmlNode() { return & m_xmlNode; } + + /** Returns true, if this tree item is bookmarked (false otherwise). */ + bool isBookmarked() const { return m_bBookmarked; } + + /** Changes this items bookmark status (see @ref KXE_TreeViewItem::m_bBookmarked) and returns the new one. */ + bool toggleBookmark(); + + /** Returns this items last child or a null pointer if there are no childs at all. */ + KXE_TreeViewItem * lastChild() const; + + /** Sets this items previous sibling. */ + void setPrevSibling( KXE_TreeViewItem * const pPrevSibling ) { m_pPrevSibling = pPrevSibling; } + + /** Returns this items previous sibling. */ + KXE_TreeViewItem * prevSibling() const { return m_pPrevSibling; } + + /** + * Does the same like @ref QListViewItem::itemAbove but the parent items doesn't need to be open. + * Returns this items previous siblings last grand child, if there is one. + * Otherwise it returns this items previous sibling or, + * if there are no sibling above, it returns this items parent or + * a null pointer (if there is no parent). + */ + KXE_TreeViewItem * prevItem(); + + /** + * Does the same like @ref QListViewItem::itemBelow but the parent items doesn't need to be open. + * Returns a pointer to the next item of this or a null pointer if this is the last item. + * This will be it's first child, + * if there are no childs, it will be the next sibling + * and if there are no siblings below, it will be this' parents next sibling ... + */ + KXE_TreeViewItem * nextItem(); + + /** Expands this items child tree up to the given level or expands the entire child tree, if iLevel == -1. */ + void expandSubTree( int iLevel = -1 ); + + /** Collapses this items child tree to the given level or collapses the entire child tree, if iLevel == 0. */ + void collapseSubTree( int iLevel = 0 ); + + /** Test, if item in parameter is my direct or indirect child item */ + bool isMyChildren(const KXE_TreeViewItem *); + + /** + * If the child items aren't created (initialized) yet + * (i.e. if m_bChildsCreated is false), it is done now. + */ + void ensureChildItemsCreated(); + /** + * If the grandchilds (child items of this item's childs) aren't created (initialized) + * yet (i.e. if m_bGrandChildsCreated is false), it is done now. + */ + void ensureGrandChildItemsCreated(); + + /** + * Starts in-place renaming, if the given column is set to be in-place + * renameable in the item's view + */ + virtual void startRename( int iCol ); + +protected: + + QDomNode m_xmlNode; + KXE_TreeViewItem * m_pPrevSibling; + bool m_bBookmarked; + bool m_bChildsCreated; + bool m_bGrandChildsCreated; + +private: + + void init(); + void initChilds(); +}; + +#endif diff --git a/part/kxe_viewattributes.cpp b/part/kxe_viewattributes.cpp new file mode 100644 index 0000000..ec6bffe --- /dev/null +++ b/part/kxe_viewattributes.cpp @@ -0,0 +1,157 @@ +/*************************************************************************** + kxe_viewattributes.cpp - description + ------------------- + begin : Thu Nov 22 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxe_viewattributes.h" + +#include "kxeattributedialog.h" + +#include +#include +#include + +KXE_ViewAttributes::KXE_ViewAttributes( QWidget * pParent, const char * pszName ) + : QTable( 0, 3, pParent, pszName ) +{ + horizontalHeader()->setLabel( 0, i18n("Namespace") ); + horizontalHeader()->setLabel( 1, i18n("Name") ); + horizontalHeader()->setLabel( 2, i18n("Value") ); + + setColumnReadOnly( 0, true ); + setColumnReadOnly( 1, true ); + setColumnReadOnly( 2, true ); + + connect( this, SIGNAL(valueChanged(int,int)), this, SLOT(slotItemRenamedInplace(int,int)) ); +} + +QDomAttr KXE_ViewAttributes::getSelectedAttribute() const +{ + if ( currentRow() == -1 ) + return QDomAttr(); + + if ( m_domElement.attributes().item(currentRow()).isAttr() ) + { + return m_domElement.attributes().item(currentRow()).toAttr(); + } + else + return QDomAttr(); +} + +void KXE_ViewAttributes::setReadWrite( bool fReadWrite ) +{ + setColumnReadOnly( 1, ! fReadWrite ); + setColumnReadOnly( 2, ! fReadWrite ); + + if ( fReadWrite ) + connect( this, SIGNAL(contextMenuRequested(int,int,const QPoint&)), this, SLOT(slotContextMenuRequested(int,int,const QPoint&)) ); + else + disconnect( this, SIGNAL(contextMenuRequested(int,int,const QPoint&)), this, SLOT(slotContextMenuRequested(int,int,const QPoint&)) ); +} + +void KXE_ViewAttributes::slotContextMenuRequested( int nRow, int nCol, const QPoint & pos ) +{ + nCol = nCol; + QString szMenuName = ( nRow == -1 ) ? "popupXmlAttributes" : "popupXmlAttribute"; + emit sigContextMenuRequested( szMenuName, pos ); +} + +void KXE_ViewAttributes::slotChange( const QDomElement & element ) +{ + m_domElement = element; + + uint iLength = m_domElement.attributes().length(); + setNumRows( iLength ); + + if ( iLength > 0 ) + { + for ( uint iRow = 0; iRow < iLength; iRow++ ) + { + QDomNode node = m_domElement.attributes().item(iRow); + if ( node.isAttr() ) + { + setText( iRow, 0, node.toAttr().namespaceURI() ); + setText( iRow, 1, node.toAttr().name() ); + setText( iRow, 2, node.toAttr().value() ); + adjustRow( iRow ); + } + else + kdError() << "KXE_ViewAttributes::slotChange: node is not an attribute (but should be)" << endl; + } + + adjustColumn(0); + adjustColumn(1); + adjustColumn(2); + } +} + +void KXE_ViewAttributes::slotItemRenamedInplace( int nRow, int nCol ) +{ + if ( nCol < 1) // only attributes names and values are changeable + { + kdError() << "KXMLEditor " << k_funcinfo << " column " << nCol << " should be unchangeable" << endl; + return; + } + + QDomNode node = m_domElement.attributes().item(nRow); + if ( node.isAttr() ) + { if (nCol == 1) + { + // check if name is OK + QString strMessage = KXEAttributeDialog::checkName(text(nRow,nCol)); + if(strMessage.length() > 0) + { + // restore old name + setText( nRow, 1, node.toAttr().name() ); // set old name + KMessageBox::sorry(this, strMessage); + return; + } + + // check, if new name not exists in attributes list + if(m_domElement.attributes().contains(text(nRow,nCol)) == false) + { + if ( node.toAttr().name() != text(nRow,nCol) ) // only if the name really was changed + { + emit sigAttributeNameChangedInplace(node.toAttr(), text(nRow,nCol) ); + } + } + else + { + KMessageBox::sorry(this, i18n("Attribute name already exists !")); + setText( nRow, 1, node.toAttr().name() ); // set old name + return; + } + } + else + { + if ( node.toAttr().value() != text(nRow,nCol) ) // only if the value really was changed + { + // check if value is OK + QString strMessage = KXEAttributeDialog::checkValue(text(nRow,nCol)); + if(strMessage.length() > 0) + { + // restore old value + setText( nRow, 2, node.toAttr().value() ); // set old value + KMessageBox::sorry(this, strMessage); + return; + } + + emit sigAttributeValueChangedInplace( node.toAttr(), text(nRow, nCol) ); + } + } + } + else + kdError() << "KXMLEditor " << k_funcinfo << " node is not an attribute (but should be)" << endl; +} diff --git a/part/kxe_viewattributes.h b/part/kxe_viewattributes.h new file mode 100644 index 0000000..c314c56 --- /dev/null +++ b/part/kxe_viewattributes.h @@ -0,0 +1,71 @@ +/*************************************************************************** + kxe_viewattributes.h - description + ------------------- + begin : Thu Nov 22 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXE_VIEWATTRIBUTES_H +#define KXE_VIEWATTRIBUTES_H + +#include +#include + +/** + * @author The KXMLEditor Team + */ +class KXE_ViewAttributes : public QTable +{ + Q_OBJECT + + public: + + KXE_ViewAttributes( QWidget * pParent = 0, const char * pszName = 0 ); + + /** Returns a pointer to the currently selected attribute or a null pointer. */ + QDomAttr getSelectedAttribute() const; + + /** Changes the behaviour of this view to readonly or readwrite. */ + void setReadWrite( bool fReadWrite ); + + public slots: + + /** Changes/Rebuilds the whole table according to the given element's attributes. */ + void slotChange( const QDomElement & element ); + + protected: + + /** the currently selected node */ + QDomElement m_domElement; + + protected slots: + + /** Called, when a context menu was requested (connected to @ref QTable::contextMenuRequested). */ + void slotContextMenuRequested( int nRow, int nCol, const QPoint & pos ); + + /** Called, when an item was changed via inplace editing. */ + void slotItemRenamedInplace( int nRow, int nCol ); + + signals: + + /** Emitted, when a context menu is requested */ + void sigContextMenuRequested( const QString & szMenuName, const QPoint & pos ); + + /** Emitted, when an attributes value was renamed via inplace editing. */ + void sigAttributeNameChangedInplace( const QDomAttr &, const QString ); + + /** Emitted, when an attributes value was renamed via inplace editing. */ + void sigAttributeValueChangedInplace( const QDomAttr &, const QString ); +}; + +#endif diff --git a/part/kxe_viewelement.cpp b/part/kxe_viewelement.cpp new file mode 100644 index 0000000..2bae53c --- /dev/null +++ b/part/kxe_viewelement.cpp @@ -0,0 +1,126 @@ +/*************************************************************************** + kxe_viewelement.cpp - description + ------------------- + begin : Mon Oct 15 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxe_viewelement.h" +#include "kxe_viewattributes.h" +#include "kxesyntaxhighlighter.h" + +#include "kxmleditorfactory.h" +#include "kxeconfiguration.h" +#include "kxetextviewsettings.h" + +#include +#include + +#include +#include +#include + + +#include "qdom_add.h" + +#define CONFIG_SPLITTER_SIZES "View Element splitter sizes" + +KXE_ViewElement::KXE_ViewElement( QWidget * pParent, KConfig *pConfig, const char * pszName ) + : QSplitter( Qt::Vertical, pParent, pszName ) +{ + setOpaqueResize(true); + m_pConfig = pConfig; + m_pViewAttributes = new KXE_ViewAttributes( this, "table of element attributes"); + connect( m_pViewAttributes, SIGNAL(sigContextMenuRequested(const QString&,const QPoint&)), this, SIGNAL(sigContextMenuRequested(const QString&,const QPoint&)) ); + + connect( m_pViewAttributes, SIGNAL(sigAttributeNameChangedInplace(const QDomAttr&, const QString)), this, SIGNAL(sigAttributeNameChangedInplace(const QDomAttr&, const QString)) ); + connect( m_pViewAttributes, SIGNAL(sigAttributeValueChangedInplace(const QDomAttr&, const QString)), this, SIGNAL(sigAttributeValueChangedInplace(const QDomAttr&, const QString)) ); + + m_pViewPlainXML = new KTextEdit( this, "plain XML" ); + m_pViewPlainXML->setReadOnly(true); + m_pViewPlainXML->setTextFormat(KTextEdit::PlainText); + m_pViewPlainXML->setPaletteBackgroundColor(pParent->palette().active().base()); // Owerwrite read-only background color + m_pViewPlainXML->setWordWrap( QTextEdit::NoWrap ); + m_pSyntaxHighlighter = new KXESyntaxHighlighter(m_pViewPlainXML); + + // configuring splitter sizes + if (m_pConfig) + { + QValueList list = m_pConfig->readIntListEntry(CONFIG_SPLITTER_SIZES); + if (!list.isEmpty()) + setSizes(list); + } + + // Apply current configuration + slotTextViewSettingsChanged(); + // and make sure to be informed about its changes. + connect( KXMLEditorFactory::configuration()->textview(), SIGNAL(sigChanged()), this, SLOT(slotTextViewSettingsChanged()) ); +} + +KXE_ViewElement::~KXE_ViewElement() +{ + // saving splitter sizes + if (m_pConfig) + m_pConfig->writeEntry( CONFIG_SPLITTER_SIZES, sizes() ); + + delete m_pSyntaxHighlighter; +} + +QDomAttr KXE_ViewElement::getSelectedAttribute() const +{ + return m_pViewAttributes->getSelectedAttribute(); +} + +void KXE_ViewElement::setReadWrite( bool fReadWrite ) +{ + m_pViewAttributes->setReadWrite(fReadWrite); +} + +void KXE_ViewElement::slotChange( const QDomElement & element ) +{ + // change attribute view + m_pViewAttributes->slotChange(element); + + int iIndent = KXMLEditorFactory::configuration()->textview()->indentSteps(); + + // change plain XML view + m_pViewPlainXML->setText( domTool_save(element, iIndent) ); +} + +////////////////////////////////////////////////////////////// +// configuration slots +////////////////////////////////////////////////////////////// + +void KXE_ViewElement::slotTextViewSettingsChanged() +{ + m_pSyntaxHighlighter->setColorDefaultText( KXMLEditorFactory::configuration()->textview()->colorDfltText() ); + m_pSyntaxHighlighter->setColorElementNames( KXMLEditorFactory::configuration()->textview()->colorElemNames() ); + m_pSyntaxHighlighter->setColorAttributeNames( KXMLEditorFactory::configuration()->textview()->colorAttrNames() ); + m_pSyntaxHighlighter->setColorAttributeValues( KXMLEditorFactory::configuration()->textview()->colorAttrValues() ); + m_pSyntaxHighlighter->setColorXmlSyntaxChars( KXMLEditorFactory::configuration()->textview()->colorSyntaxChars() ); + m_pSyntaxHighlighter->setColorComments( KXMLEditorFactory::configuration()->textview()->colorComments() ); + m_pSyntaxHighlighter->setColorSyntaxError( KXMLEditorFactory::configuration()->textview()->colorErrors() ); + + if(KXMLEditorFactory::configuration()->textview()->isWrapOn()) + { + m_pViewPlainXML->setHScrollBarMode(QScrollView::AlwaysOff); + m_pViewPlainXML->setWordWrap(QTextEdit::WidgetWidth); + } + else + { + m_pViewPlainXML->setHScrollBarMode(QScrollView::Auto); + m_pViewPlainXML->setWordWrap(QTextEdit::NoWrap); + } + + m_pSyntaxHighlighter->rehighlight(); +} diff --git a/part/kxe_viewelement.h b/part/kxe_viewelement.h new file mode 100644 index 0000000..bac7669 --- /dev/null +++ b/part/kxe_viewelement.h @@ -0,0 +1,94 @@ +/*************************************************************************** + kxe_viewelement.h - description + ------------------- + begin : Mon Oct 15 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXE_VIEWELEMENT_H +#define KXE_VIEWELEMENT_H + +#include + +#include + +// forward declarations +class KXE_ViewAttributes; +class KTextEdit; +class KConfig; +class KXESyntaxHighlighter; + + +/** + * This widget shows a table of XML elements attributes + * and plain XML text of this element and its children. + * + * @short Widget for XML elements. + */ +class KXE_ViewElement : public QSplitter +{ + Q_OBJECT + + public: + + KXE_ViewElement( QWidget * pParent, KConfig *pConfig, const char * pszName = 0 ); + ~KXE_ViewElement(); + + /** Returns a pointer to the currently selected attribute or a null pointer. */ + QDomAttr getSelectedAttribute() const; + + /** Changes the behaviour of this view to readonly or readwrite. */ + void setReadWrite( bool fReadWrite ); + + public slots: + + /** Changes/Rebuilds the whole widget according to the given element. */ + void slotChange( const QDomElement & ); + + /** + * Changes syntax highlighting colors. + */ + void slotTextViewSettingsChanged(); + + protected: + + /** table widget to display XML attributes */ + KXE_ViewAttributes * m_pViewAttributes; + /** edit widget for plain XML */ + KTextEdit * m_pViewPlainXML; + + /** configuration used to store splitter sizes */ + KConfig *m_pConfig; + + /** Syntax highlighter for m_pViewPlainXML */ + KXESyntaxHighlighter *m_pSyntaxHighlighter; + + signals: + + /** Emitted, when a context menu is requested (see @ref KXE_ViewAttributes::sigContextMenuRequested) */ + void sigContextMenuRequested( const QString & szMenuName, const QPoint & pos ); + + /** + * Emitted, when an attributes name was renamed via inplace editing + * (see @ref KXE_ViewAttributes::sigAttributeChangedInplace). + */ + void sigAttributeNameChangedInplace( const QDomAttr &, const QString ); + + /** + * Emitted, when an attributes value was renamed via inplace editing + * (see @ref KXE_ViewAttributes::sigAttributeChangedInplace). + */ + void sigAttributeValueChangedInplace( const QDomAttr &, const QString ); +}; + +#endif diff --git a/part/kxearchiveextssettings.cpp b/part/kxearchiveextssettings.cpp new file mode 100644 index 0000000..ec800c6 --- /dev/null +++ b/part/kxearchiveextssettings.cpp @@ -0,0 +1,153 @@ +/*************************************************************************** + kxearchiveextssettings.cpp + -------------------- + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxearchiveextssettings.h" +#include "kxearchiveextssettingspage.h" + +#include +#include + +#include +#include +#include +#include + +#define CONF_ENTRY_NAME_EXTS_TARGZ "Extensions" + +KXEArchiveExtsSettings::KXEArchiveExtsSettings( QObject * pParent, const char * pszName ) + : KXESettings( "TarGz Extensions", pParent, pszName ), + m_pDialogPage(0) +{ +} + + +void KXEArchiveExtsSettings::write( KConfig * pConfig ) const +{ + pConfig->writeEntry( CONF_ENTRY_NAME_EXTS_TARGZ, m_lstExtensions ); +} + + +void KXEArchiveExtsSettings::read( const KConfig * pConfig ) +{ + m_lstExtensions = pConfig->readListEntry( CONF_ENTRY_NAME_EXTS_TARGZ ); +} + +QString KXEArchiveExtsSettings::dialogPageName() const +{ + return i18n( "Archive Extensions" ); +} + +QString KXEArchiveExtsSettings::dialogPageHeader() const +{ + return i18n( "Specify Archive Extensions" ); +} + +QString KXEArchiveExtsSettings::dialogPageIcon() const +{ + return "filetypes"; +} + +QWidget * KXEArchiveExtsSettings::dialogPage( QFrame * pParent ) +{ + if ( ! m_pDialogPage ) + { + // create the page if necessary + m_pDialogPage = new KXEArchiveExtsSettingsPage( pParent, "archive extensions config.dialog page" ); + + // and fill its widgets with the corresponding values + updatePage(); + + connect( m_pDialogPage->m_pExtensions, SIGNAL(highlighted(const QString&)), this, SLOT(slotPageEditExtension(const QString&)) ); + connect( m_pDialogPage->m_pBtnNew, SIGNAL(clicked()), this, SLOT(slotPageAddExtension()) ); + connect( m_pDialogPage->m_pBtnDelete, SIGNAL(clicked()), this, SLOT(slotPageDeleteExtension()) ); + connect( m_pDialogPage->m_pExtension, SIGNAL(textChanged(const QString&)), this, SLOT(slotPageUpdateExtension(const QString&)) ); + + connect( m_pDialogPage->m_pBtnNew, SIGNAL(clicked()), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pBtnDelete, SIGNAL(clicked()), this, SIGNAL(sigDialogPageChanged()) ); + } + + return m_pDialogPage; +} + + +void KXEArchiveExtsSettings::setFromPage() +{ + if ( m_pDialogPage ) + { + m_lstExtensions.clear(); + QListBoxItem * pTmpItem = m_pDialogPage->m_pExtensions->firstItem(); + while ( pTmpItem ) + { + m_lstExtensions << pTmpItem->text(); + pTmpItem = pTmpItem->next(); + } + } +} + +void KXEArchiveExtsSettings::updatePage() const +{ + if ( m_pDialogPage ) + { + m_pDialogPage->m_pExtensions->clear(); + m_pDialogPage->m_pExtensions->insertStringList( m_lstExtensions ); + m_pDialogPage->m_pExtension->setDisabled( true ); + } +} + + +////////////////////////////////////////////////////////////////////// +// additional slots for the corresponding configuration dialog page // +////////////////////////////////////////////////////////////////////// + +void KXEArchiveExtsSettings::slotPageEditExtension( const QString & strText ) +{ + m_pDialogPage->m_pExtension->setText( strText ); + m_pDialogPage->m_pExtension->setEnabled( true ); + m_pDialogPage->m_pExtension->setFocus(); +} + +void KXEArchiveExtsSettings::slotPageAddExtension() +{ + m_pDialogPage->m_pExtensions->insertItem( "zip", 0 ); + m_pDialogPage->m_pExtensions->setCurrentItem( 0 ); + m_pDialogPage->m_pExtension->selectAll(); + m_pDialogPage->m_pExtension->setFocus(); + m_pDialogPage->m_pExtension->setEnabled( true ); +} + +void KXEArchiveExtsSettings::slotPageDeleteExtension() +{ + m_pDialogPage->m_pExtensions->removeItem( m_pDialogPage->m_pExtensions->currentItem() ); + + if ( m_pDialogPage->m_pExtensions->count() == 0 ) + { + m_pDialogPage->m_pExtension->clear(); + m_pDialogPage->m_pExtension->setDisabled( true ); + } + else + m_pDialogPage->m_pExtensions->setSelected( m_pDialogPage->m_pExtensions->currentItem(), true ); +} + +void KXEArchiveExtsSettings::slotPageUpdateExtension( const QString & strText ) +{ + if ( ( m_pDialogPage->m_pExtensions->count() > 0 ) && + ( m_pDialogPage->m_pExtensions->currentText() != m_pDialogPage->m_pExtension->text() ) ) + { + m_pDialogPage->m_pExtensions->changeItem( strText, m_pDialogPage->m_pExtensions->currentItem() ); + emit sigDialogPageChanged(); + } +} diff --git a/part/kxearchiveextssettings.h b/part/kxearchiveextssettings.h new file mode 100644 index 0000000..ad2f212 --- /dev/null +++ b/part/kxearchiveextssettings.h @@ -0,0 +1,113 @@ +/*************************************************************************** + kxearchiveextssettings.h + ------------------ + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXEARCHIVEEXTSSETTINGS_H +#define KXEARCHIVEEXTSSETTINGS_H + +#include "kxesettings.h" + +#include + +class KXEArchiveExtsSettingsPage; + +/** + * This class represents the group of configuration settings for the + * archive extensions. + * + * @author Olaf Hartig + */ +class KXEArchiveExtsSettings : public KXESettings +{ + Q_OBJECT + + public: + + KXEArchiveExtsSettings( QObject * pParent = 0, const char * pszName = 0 ); + + // The following function(s) can be used to access this object's settings. + const QStringList & extensions() const { return m_lstExtensions; } + + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageName() const; + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageHeader() const; + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageIcon() const; + /** + * Derived from @ref KXESettings + */ + virtual QWidget * dialogPage( QFrame * pParent ); + + protected: + + /** + * Derived from @ref KXESettings + */ + virtual void write( KConfig * ) const; + /** + * Derived from @ref KXESettings + */ + virtual void read( const KConfig * ); + /** + * Derived from @ref KXESettings + */ + virtual void setFromPage(); + /** + * Derived from @ref KXESettings + */ + virtual void updatePage() const; + + // the settings itself + QStringList m_lstExtensions; + + /** + * the corresponding configuration dialog page + * It is created on demand by @ref dialogPage. + */ + KXEArchiveExtsSettingsPage * m_pDialogPage; + + protected slots: + + // The following slots contain additional functionality + // for the corresponding configuration dialog page. + + /** + * Copies the selected item's extension to the editline. + */ + void slotPageEditExtension( const QString & ); + /** + * Creates a new (empty) item/ extension in the listbox and selects it. + */ + void slotPageAddExtension(); + /** + * Removes the currently selected item / extension from the listbox. + */ + void slotPageDeleteExtension(); + /** + * Copies the lineedit's current text to the currently selected item. + */ + void slotPageUpdateExtension( const QString & ); + +}; + +#endif diff --git a/part/kxearchiveextssettingspage.ui b/part/kxearchiveextssettingspage.ui new file mode 100644 index 0000000..0936850 --- /dev/null +++ b/part/kxearchiveextssettingspage.ui @@ -0,0 +1,175 @@ + +KXEArchiveExtsSettingsPage + + + KXEArchiveExtsSettingsPage + + + + 0 + 0 + 293 + 187 + + + + Archive Exts Settings Page + + + + unnamed + + + + m_pLblExtensions + + + Extensions of archive &files: + + + m_pExtensions + + + <b>Extensions of archive files</b> +<br> +This list contains the known extensions for archive files.<br> +You can choose one to edit or remove it with the dialog widgets below. + + + + + m_pExtensions + + + + 0 + 80 + + + + <b>Extensions of archive files</b> +<br> +This list contains the known extensions for archive files. + + + + + layout2 + + + + unnamed + + + + m_pLblExtension + + + &Extension: + + + m_pExtension + + + <b>Extension</b> +<br> +Change the selected extension here. + + + + + m_pExtension + + + <b>Extension</b> +<br> +Change the selected extension here. + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 71 + 20 + + + + + + layout1 + + + + unnamed + + + + m_pBtnNew + + + &New + + + Alt+N + + + <b>New</b> +<br> +You can create a new item for another known extension in the list above. + + + + + m_pBtnDelete + + + &Delete + + + Alt+D + + + <b>Delete</b> +<br> +You can delete the selected extension from the list above. + + + + + spacer1 + + + Horizontal + + + Expanding + + + + 41 + 20 + + + + + + + + + + + slotUpdateExtension( const QString & ) + slotDeleteExtension() + slotAddExtension() + + + diff --git a/part/kxeattachdialogbase.ui b/part/kxeattachdialogbase.ui new file mode 100644 index 0000000..447ac9f --- /dev/null +++ b/part/kxeattachdialogbase.ui @@ -0,0 +1,144 @@ + +KXEAttachDialogBase + + + KXEAttachDialogBase + + + + 0 + 0 + 319 + 105 + + + + Attach to XML + + + true + + + + unnamed + + + + Label + + + attachment URI: + + + + + attachURI + + + + + Layout1 + + + + unnamed + + + 0 + + + 6 + + + + buttonHelp + + + &Help + + + F1 + + + true + + + + + Horizontal Spacing2 + + + Horizontal + + + Expanding + + + + 20 + 20 + + + + + + buttonOk + + + &OK + + + + + + true + + + true + + + + + buttonCancel + + + &Cancel + + + + + + true + + + + + + + + + buttonOk + clicked() + KXEAttachDialogBase + accept() + + + buttonCancel + clicked() + KXEAttachDialogBase + reject() + + + + attachURI + buttonOk + buttonCancel + buttonHelp + + + + kurlrequester.h + klineedit.h + kpushbutton.h + + diff --git a/part/kxeattributedialog.cpp b/part/kxeattributedialog.cpp new file mode 100644 index 0000000..d64b796 --- /dev/null +++ b/part/kxeattributedialog.cpp @@ -0,0 +1,179 @@ +/*************************************************************************** + kxeattributedialog.cpp - description + ---------------------- + begin : Fre Jul 12 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxeattributedialog.h" + +#include +#include +#include + +#include +#include + +KXEAttributeDialog::KXEAttributeDialog( QWidget * pParent, const char * pszName, bool fModal, WFlags fl ) + : KXEAttributeDialogBase( pParent, pszName, fModal, fl ) +{ + connect( m_pEditNamespace, SIGNAL(textChanged(const QString &)), this, SLOT(slotNamespaceChanged(const QString &)) ); + connect( m_pEditQName, SIGNAL(textChanged(const QString &)), this, SLOT(slotNameChanged(const QString &)) ); + connect( m_pEditValue, SIGNAL(textChanged(const QString &)), this, SLOT(slotValueChanged(const QString &)) ); +} + +void KXEAttributeDialog::clearDialog() +{ + m_pEditNamespace->clear(); + m_pEditQName->clear(); + m_pEditValue->clear(); +} + +int KXEAttributeDialog::exec() +{ + clearDialog(); + + m_pBtnOK->setEnabled(false); + + m_pEditQName->setFocus(); + m_pBtnOK->setDefault(true); + + int iReturn = KXEAttributeDialogBase::exec(); + if ( iReturn == Accepted ) + { + m_strNamespace = m_pEditNamespace->text(); + m_strQName = m_pEditQName->text(); + m_strValue = m_pEditValue->text(); + } + + return iReturn; +} + +void KXEAttributeDialog::slotNameChanged(const QString & strNewName) +{ + QString strMessage = checkName(strNewName); + if(strMessage.isEmpty()) + { + strMessage = checkNamespace(m_pEditNamespace->text()); + if(strMessage.isEmpty()) + strMessage = checkValue(m_pEditValue->text()); + } + + m_pTextLabelMessage->setText(strMessage); + + if ( strNewName.isEmpty() || (strMessage.length() > 0) ) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); +} + +void KXEAttributeDialog::slotValueChanged(const QString & strNewValue) +{ + QString strMessage = checkName(m_pEditQName->text()); + if(strMessage.isEmpty()) + { + strMessage = checkNamespace(m_pEditNamespace->text()); + if(strMessage.isEmpty()) + strMessage = checkValue(strNewValue); + } + + m_pTextLabelMessage->setText(strMessage); + + if ( m_pEditQName->text().isEmpty() || (strMessage.length() > 0) ) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); +} + +void KXEAttributeDialog::slotNamespaceChanged(const QString & strNewNamespace) +{ + QString strMessage = checkName(m_pEditQName->text()); + if(strMessage.isEmpty()) + { + strMessage = checkNamespace(strNewNamespace); + if(strMessage.isEmpty()) + strMessage = checkValue(m_pEditValue->text()); + } + + m_pTextLabelMessage->setText(strMessage); + + if ( m_pEditQName->text().isEmpty() || (strMessage.length() > 0) ) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); +} + +// Check, if XML attribute name is OK +QString KXEAttributeDialog::checkNamespace(const QString strAtttributeName) +{ + if(strAtttributeName.length() == 0) + return ""; + + // test for space + if(strAtttributeName.find(' ') >= 0) + return i18n("Atttribute namespace cannot contain space !"); + + // Forbidden characters + QString strForbiddenChars("<>\"'"); + for(unsigned int i = 0; i < strForbiddenChars.length(); i++) + { + QChar ch = strForbiddenChars[i]; + + if(strAtttributeName.find(ch) >= 0) + return i18n("Atttribute namespace cannot contain character: %1 !").arg(ch); + } + + return ""; +} + +// Check, if XML attribute name is OK +QString KXEAttributeDialog::checkName(const QString strAtttributeName) +{ + if(strAtttributeName.length() == 0) + return ""; + + // test for space + if(strAtttributeName.find(' ') >= 0) + return i18n("Atttribute name cannot contain space !"); + + // Forbidden characters + QString strForbiddenChars("&@#$%^()%+?=:<>;\"'*"); + for(unsigned int i = 0; i < strForbiddenChars.length(); i++) + { + QChar ch = strForbiddenChars[i]; + + if(strAtttributeName.find(ch) >= 0) + return i18n("Atttribute name cannot contain character: %1 !").arg(ch); + } + + return ""; +} + +// Check, if XML attribute value is OK +QString KXEAttributeDialog::checkValue(const QString strData) +{ + if(strData.length() == 0) + return ""; + + // Forbidden characters + QString strForbiddenChars("<>\""); + for(unsigned int i = 0; i < strForbiddenChars.length(); i++) + { + QChar ch = strForbiddenChars[i]; + + if(strData.find(ch) >= 0) + return i18n("Attribute value cannot contain character: %1 !").arg(ch); + } + + return ""; +} diff --git a/part/kxeattributedialog.h b/part/kxeattributedialog.h new file mode 100644 index 0000000..e2019b9 --- /dev/null +++ b/part/kxeattributedialog.h @@ -0,0 +1,82 @@ +/*************************************************************************** + kxeattributedialog.h - description + -------------------- + begin : Fre Jul 12 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXEATTRIBUTEDIALOG_H +#define KXEATTRIBUTEDIALOG_H + +#include "kxeattributedialogbase.h" + +#include + +class KXEAttributeDialog : public KXEAttributeDialogBase +{ + Q_OBJECT + + public: + KXEAttributeDialog( QWidget * pParent = 0, const char * pszName = 0, bool fModal = true, WFlags fl = 0 ); + + const QString attributeNamespace() const { return m_strNamespace; } + const QString QName() const { return m_strQName; } + const QString Value() const { return m_strValue; } + + /** + * To be used for adding an attribute to new XML element. + * + * @return see @ref QDialog::exec + */ + int exec( ); + + /** + * Clears the dialogs widgets. + */ + void clearDialog(); + + // Check, if XML attribute name is OK + static QString checkName(const QString); + + // Check, if XML attribute value is OK + static QString checkValue(const QString); + + // Check, if XML attribute namespace is OK + static QString checkNamespace(const QString); + + protected slots: + /** + * Called, when user change attribute name. + * Disables the OK button, if user input is wrong or incomplete. + */ + void slotNameChanged(const QString &); + + /** + * Called, when user change attribute value. + * Disables the OK button, if user input is wrong or incomplete. + */ + void slotValueChanged(const QString &); + + /** + * Called, when user change attribute namespace. + * Disables the OK button, if user input is wrong or incomplete. + */ + void slotNamespaceChanged(const QString &); + + protected: + QString m_strNamespace; + QString m_strQName; + QString m_strValue; +}; + +#endif diff --git a/part/kxeattributedialogbase.ui b/part/kxeattributedialogbase.ui new file mode 100644 index 0000000..d03b8eb --- /dev/null +++ b/part/kxeattributedialogbase.ui @@ -0,0 +1,263 @@ + +KXEAttributeDialogBase + + + KXEAttributeDialogBase + + + + 0 + 0 + 339 + 262 + + + + XML Attribute + + + true + + + + unnamed + + + 11 + + + 6 + + + + Spacer3 + + + Vertical + + + Expanding + + + + 20 + 20 + + + + + + Spacer4 + + + Vertical + + + Expanding + + + + 20 + 20 + + + + + + Spacer4_2 + + + Vertical + + + Expanding + + + + 20 + 20 + + + + + + m_pEditNamespace + + + <b>Namespace URI</b> +<br/> +Enter the namespace URI for this attribute here. + + + + + m_pEditValue + + + <b>Value</b> +<br/> +Enter the attribute's value here. + + + + + m_pEditQName + + + <b>Qualified Name</b> +<br/> +Enter a qualified name for the attribute here. + + + + + Layout1 + + + + unnamed + + + 0 + + + 6 + + + + Horizontal Spacing2 + + + Horizontal + + + Expanding + + + + 20 + 20 + + + + + + m_pBtnOK + + + &OK + + + Alt+O + + + true + + + true + + + + + m_pBtnCancel + + + &Cancel + + + Alt+C + + + true + + + + + + + m_pLblValue + + + &Value: + + + m_pEditValue + + + <b>Value</b> +<br/> +Enter the attribute's value here. + + + + + m_pLblQName + + + Qualified &Name: + + + m_pEditQName + + + <b>Qualified Name</b> +<br/> +Enter a qualified name for the attribute here. + + + + + m_pLblNamespace + + + Namespace &URI: + + + m_pEditNamespace + + + <b>Namespace URI</b> +<br/> +Enter the namespace URI for this attribute here. + + + + + m_pTextLabelMessage + + + + 255 + 0 + 0 + + + + PlainText + + + + + + + m_pBtnOK + clicked() + KXEAttributeDialogBase + accept() + + + m_pBtnCancel + clicked() + KXEAttributeDialogBase + reject() + + + + m_pEditQName + m_pEditValue + m_pBtnOK + m_pBtnCancel + m_pEditNamespace + + + diff --git a/part/kxechardatadialog.cpp b/part/kxechardatadialog.cpp new file mode 100644 index 0000000..fb74ad4 --- /dev/null +++ b/part/kxechardatadialog.cpp @@ -0,0 +1,119 @@ +/*************************************************************************** + kxechardatadialog.cpp - description + --------------------- + begin : Don Apr 25 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxechardatadialog.h" + +#include +#include +#include +#include + +#include +#include + +KXECharDataDialog::KXECharDataDialog( QWidget * pParent, const char * pszName, bool fModal, WFlags fl ) + : KXECharDataDialogBase( pParent, pszName, fModal, fl ) +{ + connect( m_pEditData, SIGNAL(textChanged()), this, SLOT(slotDataChanged()) ); +} + +void KXECharDataDialog::clearDialog() +{ + m_pEditData->clear(); +} + +int KXECharDataDialog::exec( bool bEditExisting ) +{ + if(bEditExisting) + { + m_pComboInsert->hide(); + m_pComboInsert->setDisabled(true); + m_pLblInsert->hide(); + m_pLblInsert->setDisabled(true); + +// m_pComboType->setDisabled(true); + + m_pEditData->setText( m_strContents ); +// m_pComboType->setCurrentItem(m_eCharDataKind); + } + else + { +// m_pComboType->setEnabled(true); + clearDialog(); + } + + int iReturn = exec(); + if ( iReturn == Accepted ) + { + m_strContents = m_pEditData->text(); + m_bAtTop = ( m_pComboInsert->currentItem() == 0 ); +// m_eCharDataKind = (CharDataKind) m_pComboType->currentItem(); + } + + return iReturn; +} + +int KXECharDataDialog::exec() +{ + if ( m_pEditData->text().isEmpty() ) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); + + m_pEditData->setFocus(); + m_pBtnOK->setDefault(true); + + return KXECharDataDialogBase::exec(); +} + +void KXECharDataDialog::slotDataChanged() +{ + QString strMessage = checkContents(m_pEditData->text()); + + m_pTextLabelMessage->setText(strMessage); + + if ( m_pEditData->text().isEmpty() || (strMessage.length() > 0)) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); +} + +// Check, if XML chardata contents is OK +QString KXECharDataDialog::checkContents(const QString strData) +{ + if(strData.length() == 0) + return ""; + + // Forbidden characters + /*QString strForbiddenChars("<>"); + for(unsigned int i = 0; i < strForbiddenChars.length(); i++) + { + QChar ch = strForbiddenChars[i]; + + if(strData.find(ch) >= 0) + return i18n("Contents cannot contain character: %1 !").arg(ch); + } + + L.V. Removed this check, bacause QDomCharacterData.setData() escapec special + charactesr and data() unescapes it back to original string + + */ + + return ""; +} + + diff --git a/part/kxechardatadialog.h b/part/kxechardatadialog.h new file mode 100644 index 0000000..7e1507b --- /dev/null +++ b/part/kxechardatadialog.h @@ -0,0 +1,83 @@ +/*************************************************************************** + kxechardatadialog.h - description + ------------------- + begin : Don Apr 25 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXECHARDATADIALOG_H +#define KXECHARDATADIALOG_H + +#include "kxechardatadialogbase.h" + +enum CharDataKind + { + CharDataTextNode = 0, + CharDataCDATASection, + CharDataComment + }; + +class KXECharDataDialog : public KXECharDataDialogBase +{ + Q_OBJECT + + public: + KXECharDataDialog( QWidget * pParent = 0, const char * pszName = 0, bool fModal = true, WFlags fl = 0 ); + +// const CharDataKind charDataKind() const { return m_eCharDataKind; } + const bool atTop() const { return m_bAtTop; } + const QString contents() const { return m_strContents; } + + void setContents(const QString strContents) { m_strContents = strContents; } +// void setCharDataKind(const CharDataKind eCharDataKind) { m_eCharDataKind = eCharDataKind; } + + public: + + /** + * To be used for inserting the given XML character data as child + * of the given parent element. + * + * @return see @ref QDialog::exec + */ + int exec( bool ); + + /** + * Clears the dialogs widgets. + */ + void clearDialog(); + + // check contents + static QString checkContents(const QString); + + protected: + /** + * Don't use this function directly, it's for internal use only. + * Use one of the other @ref DlgXMLCharData::exec functions instead. + */ + int exec(); + + protected slots: + /** + * Called, when the data in the text edit @ref DlgXMLCharDataBase::m_pEditData + * is changed. + * Disables the OK button, if the given string is empty. + */ + void slotDataChanged(); + + protected: + //CharDataKind m_eCharDataKind; + bool m_bAtTop; + QString m_strContents; +}; + +#endif diff --git a/part/kxechardatadialogbase.ui b/part/kxechardatadialogbase.ui new file mode 100644 index 0000000..7f8b874 --- /dev/null +++ b/part/kxechardatadialogbase.ui @@ -0,0 +1,213 @@ + +KXECharDataDialogBase + + + KXECharDataDialogBase + + + + 0 + 0 + 389 + 289 + + + + XML Character Data + + + true + + + + unnamed + + + 11 + + + 6 + + + + Layout4 + + + + unnamed + + + 0 + + + 6 + + + + m_pLblInsert + + + &Insert: + + + m_pComboInsert + + + <b>Insert</b> +<br/> +Choose, where to place this XML character data in the XML elements list of childnodes. + + + + + + at bottom + + + + + at top + + + + m_pComboInsert + + + <b>Insert</b> +<br/> +Choose, where to place this XML character data in the XML elements list of childnodes. + + + + + Spacer6 + + + Horizontal + + + Expanding + + + + 20 + 20 + + + + + + + + m_pEditData + + + PlainText + + + NoWrap + + + You can edit the XML character data in this editor. + + + + + Layout1 + + + + unnamed + + + 0 + + + 6 + + + + Horizontal Spacing2 + + + Horizontal + + + Expanding + + + + 20 + 20 + + + + + + m_pBtnOK + + + &OK + + + Alt+O + + + true + + + true + + + + + m_pBtnCancel + + + &Cancel + + + true + + + + + + + m_pTextLabelMessage + + + + 255 + 0 + 0 + + + + PlainText + + + + + + + m_pBtnOK + clicked() + KXECharDataDialogBase + accept() + + + m_pBtnCancel + clicked() + KXECharDataDialogBase + reject() + + + + m_pEditData + m_pBtnOK + m_pBtnCancel + m_pComboInsert + + + diff --git a/part/kxechoosestringdialog.cpp b/part/kxechoosestringdialog.cpp new file mode 100644 index 0000000..d36ed68 --- /dev/null +++ b/part/kxechoosestringdialog.cpp @@ -0,0 +1,42 @@ +/*************************************************************************** + kxechoosestringdialog.cpp - description + ------------------------- + begin : Fri Jul 20 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxechoosestringdialog.h" + +#include +#include +#include + +KXEChooseStringDialog::KXEChooseStringDialog(QWidget *parent, + const char *name, + const char *szCaption, + const char *szPrompt) + : KXEChooseStringDialogBase(parent, name, true) +{ + m_pComboBox->setEditable(true); + m_pComboBox->setFocus(); + m_pPushButtonOk->setDefault(true); + setCaption(szCaption); + m_pTextLabel->setText(szPrompt); +} + +/** Called, when user press OK button */ +void KXEChooseStringDialog::slotOk() +{ + m_strChoosedText = m_pComboBox->currentText(); + accept(); +} diff --git a/part/kxechoosestringdialog.h b/part/kxechoosestringdialog.h new file mode 100644 index 0000000..2065e3a --- /dev/null +++ b/part/kxechoosestringdialog.h @@ -0,0 +1,44 @@ +/*************************************************************************** + kxechoosestringdialog.h - description + ----------------------- + begin : Fri Jul 20 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXECHOOSESTRINGDIALOG_H +#define KXECHOOSESTRINGDIALOG_H + +#include "kxechoosestringdialogbase.h" + +#include + +/**Dialog with combobox that allow enter +or select any string + *@author Lumir Vanek + */ + +class KXEChooseStringDialog : public KXEChooseStringDialogBase +{ + Q_OBJECT +public: + KXEChooseStringDialog(QWidget *, const char *, const char *, const char *); + +protected slots: // Protected slots + /** Called, when user press OK button */ + void slotOk(); +public: // Public attributes + /** Contain text choosed by user */ + QString m_strChoosedText; +}; + +#endif diff --git a/part/kxechoosestringdialogbase.ui b/part/kxechoosestringdialogbase.ui new file mode 100644 index 0000000..5fb8079 --- /dev/null +++ b/part/kxechoosestringdialogbase.ui @@ -0,0 +1,143 @@ + +KXEChooseStringDialogBase +Dialog with combobox that allow enter +or select any string +Lumir Vanek + + + KXEChooseStringDialogBase + + + + 0 + 0 + 228 + 137 + + + + Choose string + + + + unnamed + + + 11 + + + 6 + + + + m_pComboBox + + + <b>Enter string<b/> +<br/> +Enter or choose string, that you want. + + + + + Layout3 + + + + unnamed + + + 0 + + + 6 + + + + Spacer4 + + + Horizontal + + + Expanding + + + + 20 + 20 + + + + + + m_pPushButtonOk + + + &OK + + + + + m_pPushButtonCancel + + + &Cancel + + + + + + + m_pTextLabel + + + &Enter string: + + + m_pComboBox + + + <b>Enter string<b/> +<br/> +Enter or choose string, that you want. + + + + + Spacer1 + + + Horizontal + + + Expanding + + + + 117 + 20 + + + + + + + + m_pPushButtonCancel + clicked() + KXEChooseStringDialogBase + reject() + + + m_pPushButtonOk + clicked() + KXEChooseStringDialogBase + slotOk() + + + + slotOk() + + + diff --git a/part/kxecommand.cpp b/part/kxecommand.cpp new file mode 100644 index 0000000..f197fc3 --- /dev/null +++ b/part/kxecommand.cpp @@ -0,0 +1,25 @@ +// +// C++ Implementation: kxecommand +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kxecommand.h" + +KXECommand::KXECommand(KXEDocument* pDocument) +:KCommand() +{ + m_pDocument = pDocument;; +} + + +KXECommand::~KXECommand() +{ +} + + diff --git a/part/kxecommand.h b/part/kxecommand.h new file mode 100644 index 0000000..8d05ebd --- /dev/null +++ b/part/kxecommand.h @@ -0,0 +1,37 @@ +// +// C++ Interface: kxecommand +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef KXECOMMAND_H +#define KXECOMMAND_H + +#include +#include "kxedocument.h" + +/** +This is a base class for undoable commands in our application + +@author Adam Charytoniuk +*/ +class KXECommand : public KCommand +{ +public: + /** Constructor. Commands refer only to KXEDocument, not parts or views. + The KXEDocument is a class that owns KCommandHistory objcect. + */ + KXECommand(KXEDocument* pDocument); + + ~KXECommand(); + +protected: + KXEDocument* m_pDocument; +}; + +#endif diff --git a/part/kxeconfiguration.cpp b/part/kxeconfiguration.cpp new file mode 100644 index 0000000..d780add --- /dev/null +++ b/part/kxeconfiguration.cpp @@ -0,0 +1,181 @@ +/*************************************************************************** + kxeconfiguration.cpp + -------------------- + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxeconfiguration.h" +#include "kxetreeviewsettings.h" +#include "kxetextviewsettings.h" +#include "kxenewfilesettings.h" +#include "kxeprintsettings.h" +#include "kxearchiveextssettings.h" + +#include +#include +#include +#include + +#include + + +KXEConfiguration::KXEConfiguration() + : QObject( 0, "KXMLEditor's configuration (KXEConfiguration)" ), + m_pDialog( 0 ) +{ + // initialize all setting group objects + m_pTreeView = new KXETreeViewSettings( this, "tree view config. settings" ); + m_pTextView = new KXETextViewSettings( this, "text view config. settings" ); + m_pNewFile = new KXENewFileSettings( this, "new file config. settings" ); + m_pPrint = new KXEPrintSettings( this, "printing config. settings" ); + m_pArcExts = new KXEArchiveExtsSettings( this, "archive extension config. settings" ); + + // restore the settings from our config file + restore(); +} + +KXEConfiguration::~KXEConfiguration() +{ + if ( m_pDialog ) + delete m_pDialog; +} + +void KXEConfiguration::store( KConfig * pConfig ) const +{ + if ( ! pConfig ) + pConfig = KGlobal::config(); + + m_pTreeView->store( pConfig ); + m_pTextView->store( pConfig ); + m_pNewFile->store( pConfig ); + m_pPrint->store( pConfig ); + m_pArcExts->store( pConfig ); +} + + +void KXEConfiguration::restore( KConfig * pConfig ) +{ + if ( ! pConfig ) + pConfig = KGlobal::config(); + + m_pTreeView->restore( pConfig ); + m_pTextView->restore( pConfig ); + m_pNewFile->restore( pConfig ); + m_pPrint->restore( pConfig ); + m_pArcExts->restore( pConfig ); +} + + +void KXEConfiguration::showDialog() +{ + if ( ! m_pDialog ) // if there is no dialog yet, + { + // create one + m_pDialog = new KDialogBase( KDialogBase::IconList, // dialog face + i18n("Configure KXMLEditor"), // caption + KDialogBase::Apply | KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help, // buttons + KDialogBase::Ok, // default button + 0, // parent + "configuration dialog", // name + false, // not modal + true ); // show separator + connect( m_pDialog, SIGNAL(applyClicked()), this, SLOT(slotDlgApplied()) ); + connect( m_pDialog, SIGNAL(okClicked()), this, SLOT(slotDlgApplied()) ); + + // and add the pages + QFrame * pFrame; + QWidget * pPage; + QVBoxLayout * pLayout; + + // - tree view properties page + pFrame = m_pDialog->addPage( m_pTreeView->dialogPageName(), + m_pTreeView->dialogPageHeader(), + KGlobal::instance()->iconLoader()->loadIcon( m_pTreeView->dialogPageIcon(), KIcon::NoGroup, KIcon::SizeMedium ) ); + pLayout = new QVBoxLayout( pFrame ); + pPage = m_pTreeView->dialogPage( pFrame ); + pLayout->addWidget( pPage ); + connect( m_pTreeView, SIGNAL(sigDialogPageChanged()), this, SLOT(slotDlgChanged()) ); + + // - text view properties page + pFrame = m_pDialog->addPage( m_pTextView->dialogPageName(), + m_pTextView->dialogPageHeader(), + KGlobal::instance()->iconLoader()->loadIcon( m_pTextView->dialogPageIcon(), KIcon::NoGroup, KIcon::SizeMedium ) ); + pLayout = new QVBoxLayout( pFrame ); + pPage = m_pTextView->dialogPage( pFrame ); + pLayout->addWidget( pPage ); + connect( m_pTextView, SIGNAL(sigDialogPageChanged()), this, SLOT(slotDlgChanged()) ); + + // - new file settings page + pFrame = m_pDialog->addPage( m_pNewFile->dialogPageName(), + m_pNewFile->dialogPageHeader(), + KGlobal::instance()->iconLoader()->loadIcon( m_pNewFile->dialogPageIcon(), KIcon::NoGroup, KIcon::SizeMedium ) ); + pLayout = new QVBoxLayout( pFrame ); + pPage = m_pNewFile->dialogPage( pFrame ); + pLayout->addWidget( pPage ); + connect( m_pNewFile, SIGNAL(sigDialogPageChanged()), this, SLOT(slotDlgChanged()) ); + + // - printing's settings page + pFrame = m_pDialog->addPage( m_pPrint->dialogPageName(), + m_pPrint->dialogPageHeader(), + KGlobal::instance()->iconLoader()->loadIcon( m_pPrint->dialogPageIcon(), KIcon::NoGroup, KIcon::SizeMedium ) ); + pLayout = new QVBoxLayout( pFrame ); + pPage = m_pPrint->dialogPage( pFrame ); + pLayout->addWidget( pPage ); + connect( m_pPrint, SIGNAL(sigDialogPageChanged()), this, SLOT(slotDlgChanged()) ); + + // - archive extensions page + pFrame = m_pDialog->addPage( m_pArcExts->dialogPageName(), + m_pArcExts->dialogPageHeader(), + KGlobal::instance()->iconLoader()->loadIcon( m_pArcExts->dialogPageIcon(), KIcon::NoGroup, KIcon::SizeMedium ) ); + pLayout = new QVBoxLayout( pFrame ); + pPage = m_pArcExts->dialogPage( pFrame ); + pLayout->addWidget( pPage ); + connect( m_pArcExts, SIGNAL(sigDialogPageChanged()), this, SLOT(slotDlgChanged()) ); + } + + if ( m_pDialog->isVisible() ) // If the dialog is visible (probably opened by + { // another part), it has to be hidden to make + m_pDialog->hide(); // it appear on the current desktop by the later + } // call of show. + else // If the dialog is not visible, it's + { // Apply- and Ok-buttons have to be + m_pDialog->enableButtonApply( false ); // disabled (until something is changed + m_pDialog->enableButtonOK( false ); // within the dialog). + } + + m_pDialog->show(); // show our configuration dialog +} + +void KXEConfiguration::slotDlgApplied() +{ + // reset configuration dialog + m_pDialog->enableButtonApply( false ); + m_pDialog->enableButtonOK( false ); + + // apply the page's data to the corresponding setting groups + m_pTreeView->apply(); + m_pTextView->apply(); + m_pNewFile->apply(); + m_pPrint->apply(); + m_pArcExts->apply(); + + // store the applied data to our config file + store(); +} + +void KXEConfiguration::slotDlgChanged() +{ + m_pDialog->enableButtonApply( true ); + m_pDialog->enableButtonOK( true ); +} diff --git a/part/kxeconfiguration.h b/part/kxeconfiguration.h new file mode 100644 index 0000000..3afd8b2 --- /dev/null +++ b/part/kxeconfiguration.h @@ -0,0 +1,123 @@ +/*************************************************************************** + kxeconfiguration.h + ------------------ + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXECONFIGURATION_H +#define KXECONFIGURATION_H + +#include + +class KXETreeViewSettings; +class KXETextViewSettings; +class KXENewFileSettings; +class KXEPrintSettings; +class KXEArchiveExtsSettings; + +class KConfig; +class KDialogBase; + +/** + * This class is a container for KXMLEditor's configuration data. + * It consists of objects for the different groups of settings + * (objects of child classes of KXESettings) and manages the configuration + * dialog (@ref m_pDialog). This dialog consists of one page per settings + * group, that are initialized by them (using their dialogPage* functions). + * + * @short container for KXMLEditor's configuration data + * @author Olaf Hartig + */ +class KXEConfiguration : public QObject +{ + Q_OBJECT + + public: + + /** + * The constructor initializes the configuration setting groups + * (objects of KXESettings' child classes) and restores the + * configuration data from the config file by calling @ref restore. + */ + KXEConfiguration(); + /** + * The destructor deletes the configuration dialog, if there is one. + */ + ~KXEConfiguration(); + + /** + * Stores all configuration to the given @ref KConfig object by + * using @ref KXESettings's @ref store function. + * If no @ref KConfig object is given, @ref KGlobal::config is + * used. + */ + void store( KConfig * pConfig = 0 ) const; + /** + * Restores all configuration from the given @ref KConfig object + * by using @ref KXESettings's @ref restore function. + * If no @ref KConfig object is given, @ref KGlobal::config is + * used. + */ + void restore( KConfig * pConfig = 0 ); + /** + * Shows the configuration dialog. + * If there is no one yet, it is created by. + */ + void showDialog(); + + // The following functions return pointers to the configuration setting + // groups (objects of KXESettings' child classes), that can be used to + // access their data (or to connect to their signals). + + KXETreeViewSettings * const treeview() const { return m_pTreeView; } + KXETextViewSettings * const textview() const { return m_pTextView; } + KXENewFileSettings * const newfile() const { return m_pNewFile; } + KXEPrintSettings * const print() const { return m_pPrint; } + KXEArchiveExtsSettings * const archexts() const { return m_pArcExts; } + + protected slots: + + /** + * Applies the new data in the dialog's pages to our setting groups + * by using @ref KXESettings's @ref apply function and stores + * all settings with @ref store. + * After applying, the dialog's state is reseted (disabled Apply- and + * OK-buttons). + */ + void slotDlgApplied(); + /** + * Enables the configuration dialog's Apply- and OK-button. + */ + void slotDlgChanged(); + + protected: + + // The following members are the configuration setting + // groups (objects of KXESettings' child classes). + + KXETreeViewSettings * m_pTreeView; + KXETextViewSettings * m_pTextView; + KXENewFileSettings * m_pNewFile; + KXEPrintSettings * m_pPrint; + KXEArchiveExtsSettings * m_pArcExts; + + /** + * This is a pointer to our configuration dialog. + * The dialog itself is created on demand in @ref showDialog. + * It consists of one page per settings group. + */ + KDialogBase * m_pDialog; +}; + +#endif diff --git a/part/kxedocument.cpp b/part/kxedocument.cpp new file mode 100644 index 0000000..c3775c5 --- /dev/null +++ b/part/kxedocument.cpp @@ -0,0 +1,631 @@ +// +// C++ Implementation: kxedocument +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kxedocument.h" + +#include "kxmleditorfactory.h" +#include "kxeconfiguration.h" +#include "kxenewfilesettings.h" +#include "kxearchiveextssettings.h" +#include "kxeprintsettings.h" +#include "kxetextviewsettings.h" +#include "kxechoosestringdialog.h" +#include "kxeattachdialogbase.h" +#include "kxespecprocinstrdialog.h" +#include "kxefilenewdialog.h" +#include "commands_file.h" + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +KXEDocument::KXEDocument(QObject *parent, const char *name) + :QObject (parent,name), + QDomDocument(), + KXMLGUIClient() +{ + m_bDocIsCompressed = false; + m_bIsModified = false; + m_strCompressedTarEntryName = ""; + m_url = ""; + + //setXMLFile("kxedocument.rc"); +} + + +KXEDocument::~KXEDocument() +{ +} + + +bool KXEDocument::save(const QString &strFileName) +{ + if (this->documentElement().isNull() && + KMessageBox::warningContinueCancel(0, + i18n("Your file doesn't have root element defined. \n\ + Continue saving?"))==KMessageBox::Cancel ) + { + return false; + } + + QString strXML; + + QTextStream streamXML(&strXML, IO_WriteOnly); + int iIndent = KXMLEditorFactory::configuration()->textview()->indentSteps(); + ((QDomDocument*)this)->save(streamXML, iIndent); + + QString strEncoding; + QTextCodec *pTextCodec; + + // find encoding info + if(strXML.left(5) == " 0) + { + // info about encoding found; + iStart += 8; // skip encoding + + // search " or ' after encoding + if((iStart = strXML.find(QRegExp("[\"']"), iStart)) > 0) + { + QChar ch = strXML[iStart]; + iStart++; // skip ch + if((iEnd = strXML.find(ch, iStart)) > 0) + { + strEncoding = strXML.mid(iStart, iEnd - iStart); + } + } + } + } + + if(strEncoding.length() <= 0) + pTextCodec = QTextCodec::codecForLocale(); // default + else + pTextCodec = QTextCodec::codecForName(strEncoding); + + if(pTextCodec == 0) + { if(KMessageBox::questionYesNo(0, i18n("Codec for encoding %1 not found ! Continue saving ?").arg(strEncoding)) != KMessageBox::Yes) + return false; + } + + QCString strDecoded; + if(pTextCodec) + { strDecoded = pTextCodec->fromUnicode(strXML); + } + + // save string to file + if(!m_bDocIsCompressed) + { QFile file(strFileName); + if(file.open(IO_WriteOnly) == true) + { file.writeBlock(strDecoded, strDecoded.length()); + file.flush(); + file.close(); + } + else + { KMessageBox::error(0, + i18n("Can't create file %1").arg(strFileName), + i18n("Write error !")); + } + } + else + { // obtain file extension ----------------------------------------- + QString strExtension; + + int iPos = strFileName.findRev('.'); + + if(iPos > 0) + { strExtension = strFileName.mid(iPos + 1); + } + + if(strExtension == "svgz") + { + KMessageBox::sorry(0, + "Saving *.svgz not implemented yet", + "sory"); + return false; + } + else + { + KZip tarGzFile(strFileName); // New KOffice use KZip instead of KTarGz for storing files + if(tarGzFile.open(IO_WriteOnly)) + { tarGzFile.writeFile(m_strCompressedTarEntryName, "user", "group", strDecoded.length(), strDecoded); + tarGzFile.close(); + } + else + { KMessageBox::error(0, + i18n("Can't create archive %1").arg(strFileName), + i18n("Write error !")); + } + } + } + + return true; +} + +bool KXEDocument::open(const QString &strFileName) +{ + QString strCompressedTarEntryName; + + kdDebug() << "KXEDocument::open: opening file " << strFileName << endl; + + // obtain file extension ----------------------------------------- + QString strExtension; + + int iPos = strFileName.findRev('.'); + + if(iPos > 0) + { strExtension = strFileName.mid(iPos + 1); + } + + QString strTmpfileName; + + if ( KXMLEditorFactory::configuration()->archexts()->extensions().contains(strExtension) ) + { + + KTempFile tmp; + if (tmp.status() != 0) + { + kdError() << "Couldn't open temp file" << endl; + KMessageBox::sorry(0, i18n("Couldn't open temp file !")); + return false; + } + + tmp.setAutoDelete(false); + QFile &fileTemporary = *(tmp.file()); + + + if(strExtension == "svgz") + { + //----------------------- It is gzip compressed file ----------------------- + + m_strCompressedTarEntryName = strFileName.left(strFileName.length() - 5); // For SVG compressed icons strip extension, e.g. "kate.svgz" has entry "kate" etc + + iPos = m_strCompressedTarEntryName.findRev('/'); + + if(iPos > 0) + { m_strCompressedTarEntryName = m_strCompressedTarEntryName.mid(iPos + 1); + } + + QIODevice *pIODevice = KFilterDev::deviceForFile(strFileName, "application/x-gzip"); + + if(pIODevice->open( IO_ReadOnly )) + { + QTextStream stream(pIODevice); + QString line; + //int i = 1; + while ( !stream.atEnd() ) + { + line = stream.readLine(); // line of text excluding '\n' + //printf( "%3d: %s\n", i++, line.latin1() ); + fileTemporary.writeBlock(line, line.length()); + } + pIODevice->close(); + } + } + else + { + //----------------------- It is zip archive file --------------------------- + + KZip tarGzFile(strFileName); // new KOffice use KZip instead of KTarGz for storing files + + tarGzFile.open(IO_ReadOnly); + fileTemporary.open(IO_WriteOnly); + + const KTarDirectory *root = tarGzFile.directory(); + if(!root) + { + return false; + } + + // For KOffice files let user to choose maindoc or documentinfo + if(strCompressedTarEntryName.length() == 0) + { KXEChooseStringDialog dlgChooseString(0, 0, i18n("Choose file"), i18n("File:")); + dlgChooseString.m_pComboBox->insertItem("maindoc.xml"); + dlgChooseString.m_pComboBox->insertItem("documentinfo.xml"); + + if(dlgChooseString.exec() != KXEChooseStringDialog::Accepted) + { return false; + } + m_strCompressedTarEntryName = dlgChooseString.m_strChoosedText; + } + else + { + m_strCompressedTarEntryName = strCompressedTarEntryName; + } + + const KArchiveEntry *entry = root->entry(m_strCompressedTarEntryName); + + if(entry && entry->isFile()) + { const KArchiveFile *pTarFile = static_cast (entry); + + QBuffer buffer(pTarFile->data()); + buffer.open(IO_ReadOnly); + + fileTemporary.writeBlock(buffer.buffer(), buffer.size()); + } + else + m_strCompressedTarEntryName.truncate(0); + + tarGzFile.close(); + } + + strTmpfileName = fileTemporary.name(); + fileTemporary.close(); + + m_bDocIsCompressed = true; + } + else + m_bDocIsCompressed = false; + + + // ( 1.) parse the file and fill our document + QFile file(m_bDocIsCompressed ? strTmpfileName : strFileName); + if(! file.open(IO_ReadOnly)) + { + kdDebug() << "KXEDocument::openFile: Can't open file." << endl; + return false; + } + + // auxiliary file for obtaining encoding info + QFile fileAux(m_bDocIsCompressed ? strTmpfileName : strFileName); + if(! fileAux.open(IO_ReadOnly)) + { + kdDebug() << "KXEDocument::openFile: Can't open file." << endl; + return false; + } + + QTextStream txtStreamLocal( & file ); + + // Lookup at XML document encoding ----------------------------------------------- + QTextStream txtStreamAux( & fileAux ); + QString strFirstLine = txtStreamAux.readLine(); + fileAux.close(); + int iStart, iEnd; + if((iStart = strFirstLine.find("encoding", 0)) > 0) + { + QString strEncoding; + // info about encoding found; + iStart += 8; // skip encoding + + // search " or ' after encoding + if((iStart = strFirstLine.find(QRegExp("[\"']"), iStart)) > 0) + { + QChar ch = strFirstLine[iStart]; + iStart++; // skip ch + if((iEnd = strFirstLine.find(ch, iStart)) > 0) + { + strEncoding = strFirstLine.mid(iStart, iEnd - iStart); + + QTextCodec *pTextCodec = QTextCodec::codecForName(strEncoding); + if(pTextCodec) + txtStreamLocal.setCodec(pTextCodec); + else + { + KMessageBox::sorry(0, i18n("Codec for encoding %1 not found ! Using locale encoding for load.").arg(strEncoding)); + txtStreamLocal.setEncoding(QTextStream::Locale); + } + } + } + } + else + { + // XML documment dont have info about encoding, set default UTF-8 + txtStreamLocal.setCodec(QTextCodec::codecForName("UTF-8")); + } + + + //-------------------------------------------------------------------------------- + QString strFileContents = txtStreamLocal.read(); + file.close(); + + if(m_bDocIsCompressed) + { + QDir dir; + dir.remove(strTmpfileName); + } + + //-- Set string with XML to QDomDocument ------------------------------------------ + QString strErrorMsg; + int iErrorLine, iErrorColumn; + QDomDocument * pNewDoc = new QDomDocument; // first try with a new document + + if( ! pNewDoc->setContent(strFileContents, true, &strErrorMsg, &iErrorLine, &iErrorColumn) ) + { kdDebug() << "KXEDocument::openFile: Failed parsing the file." << endl; + + KMessageBox::error(0, + i18n("%1 in line %2, column %3").arg(strErrorMsg).arg(iErrorLine).arg(iErrorColumn), + i18n("Parsing error !")); + + delete pNewDoc; // remove the new document, because it's useless + return false; + } + +// The following commented code is performance wise buggy, because the string +// gets parsed a second time. I replaced it with this code. + // copy the content of the parsed document to this one + QDomNode e = pNewDoc->removeChild( pNewDoc->documentElement() ); + QDomDocument::operator=( *pNewDoc ); + appendChild( e ); +// Here comes the "buggy" code. + //this->setContent(pNewDoc->toString(),true,0,0); // and take the new one + //delete pNewDoc; // remove the former document +// To test/see the difference in loading time, you can switch the commented +// codeblocks above and compare the loading-time-differences measured in +// KXMLEditorPart::openFile. +// Olaf +// TODO: remove the comments above later + + emit sigOpened(); + + return true; +} + +void KXEDocument::setModified(bool value) +{ + m_bIsModified = value; + emit sigModified(value); +} + +void KXEDocument::setURL(KURL url) +{ + m_url = url; + emit sigURLChanged(url); +} + +void KXEDocument::updateNodeCreated(const QDomNode & node) +{ + emit sigNodeCreated(node); + setModified(); +} + +void KXEDocument::updateNodeDeleted(const QDomNode & node) +{ + emit sigNodeDeleted(node); + setModified(); +} + +void KXEDocument::updateNodeChanged( const QDomElement & domElement ) +{ + emit sigNodeChanged(domElement); + setModified(); +} + +void KXEDocument::updateNodeChanged( const QDomCharacterData & node ) +{ + emit sigNodeChanged(node); + setModified(); +} + +void KXEDocument::updateNodeChanged( const QDomProcessingInstruction &domProcInstr ) +{ + emit sigNodeChanged(domProcInstr); + setModified(); +} + +void KXEDocument::updateNodeMoved( const QDomNode & node ) +{ + emit sigNodeMoved(node); + setModified(); +} + +void KXEDocument::attachStylesheet(const KURL& stylesheet) +{ + setSpecProcInstr("xml-stylesheet",QString("type = 'text/xsl' href = '")+stylesheet.url()+"' "); +} + +void KXEDocument::detachStylesheet() +{ + removeSpecProcInstr("xml-stylesheet"); +} + +void KXEDocument::attachSchema(const KURL& schema) +{ + QDomElement domElement = documentElement(); + if (!domElement.isNull()) + { + domElement.setAttributeNS(SCHEMA_NAMESPACE, + SCHEMA_ATTRIBUTE_XSI, + schema.url()); + // refresh views + updateNodeChanged(domElement); + setModified(); + } +} + +void KXEDocument::detachSchema() +{ + QDomElement domElement = this->documentElement(); + if (!domElement.isNull()) + { + domElement.removeAttributeNS(SCHEMA_NAMESPACE,SCHEMA_ATTRIBUTE); + // refresh views + updateNodeChanged(domElement); + setModified(); + } +} + +void KXEDocument::setSpecProcInstr(const QString& target, const QString& data) +{ + // removing old one + removeSpecProcInstr(target); + // create new one + if (!data.isEmpty()) + { + QDomProcessingInstruction domProcInstr = this->createProcessingInstruction(target,data); + + QDomNode node = getSpecProcInstr("xml"); + if (!node.isNull()) + // if there is already xml instruction, then put that one below it + this->insertAfter(domProcInstr,node); + else + // otherwise put it always on the top + this->insertBefore(domProcInstr,this->firstChild()); + + updateNodeCreated(domProcInstr); + } + setModified(); +} + +void KXEDocument::removeSpecProcInstr(const QString &target) +{ + QDomNode domNode = getSpecProcInstr(target); + if (!domNode.isNull()) + { + updateNodeDeleted(domNode); + ((QDomDocument*)this)->removeChild(domNode); + setModified(); + } +} + +QDomNode KXEDocument::getSpecProcInstr(const QString& target) +{ + QDomNode result; + QDomNodeList domNodeList = this->childNodes(); + for (uint i=0;inewfile()->newFileCreaBehav() ) + { + case KXENewFileSettings::CreateEmptyFile: + break; // nothing to do in this case + + case KXENewFileSettings::CreateWithAssistance: + { + + KXEFileNewDialog dlg( 0L); + dlg.fillDialog( KXMLEditorFactory::configuration()->newfile()->dfltVersion(), + KXMLEditorFactory::configuration()->newfile()->dfltEncoding() ); + if( dlg.exec() ) + { // if the dialog has been accepted (OK pressed) + setSpecProcInstr( "xml", dlg.getData() ); + + // if the dialog shouldn't be shown anymore, the settings have to be changed + if ( dlg.m_pDontShowAgain->isChecked() ) + KXMLEditorFactory::configuration()->newfile()->setNewFileCreaBehav( KXENewFileSettings::UseDefaults, instance()->config() ); + } + + break; + } + + case KXENewFileSettings::UseDefaults: + setSpecProcInstr( "xml", QString( "version='%1' encoding='%2'" ).arg(KXMLEditorFactory::configuration()->newfile()->dfltVersion()).arg(KXMLEditorFactory::configuration()->newfile()->dfltEncoding()) ); + break; + } + emit sigOpened(); + setModified(); +} + +//------------- SLOTS, called from Part -------------------------------- + +KCommand * KXEDocument::actDetachStylesheet() +{ + QDomNode domNode = getSpecProcInstr("xml-stylesheet"); + if (!domNode.isNull()) + { + KCommand *pCmd = new KXEStylesheetDetachCommand(this,domNode.toProcessingInstruction().data()); + return pCmd; + } + return 0L; +} + +KCommand * KXEDocument::actAttachStylesheet() +{ + KXEAttachDialogBase dlg; + dlg.Label->setText(i18n("Stylesheet URL:")); + if (dlg.exec()) + { + QDomNode domNode = getSpecProcInstr("xml-stylesheet"); + QString data = ""; + if (!domNode.isNull()) + data = domNode.toProcessingInstruction().data(); + KCommand *pCmd = new KXEStylesheetAttachCommand(this,data,dlg.attachURI->url()); + return pCmd; + } + return 0L; +} + +KCommand * KXEDocument::actDetachSchema() +{ + if (!documentElement().isNull()) // just for sure... + { + KCommand *pCmd = new KXESchemaDetachCommand(this, + documentElement().attributeNS(SCHEMA_NAMESPACE, + SCHEMA_ATTRIBUTE,"") + ); + return pCmd; + } + return 0L; +} + +KCommand * KXEDocument::actAttachSchema() +{ + KXEAttachDialogBase dlg; + dlg.Label->setText(i18n("Schema URL:")); + if (dlg.exec()) + { + if (!documentElement().isNull()) // just for sure... + { + KCommand *pCmd = new KXESchemaAttachCommand(this,dlg.attachURI->url(), + documentElement().attributeNS(SCHEMA_NAMESPACE,SCHEMA_ATTRIBUTE,"")); + return pCmd; + } + } + return 0L; +} + +// Instert or edit special processing instruction +KCommand * KXEDocument::actVersionEncoding() +{ + QDomNode node = getSpecProcInstr("xml"); + KXESpecProcInstrDialog dlg; + + if(!node.isNull()) + dlg.fillDialog(node.toProcessingInstruction().data()); + else + dlg.fillDialog( KXMLEditorFactory::configuration()->newfile()->dfltVersion(), + KXMLEditorFactory::configuration()->newfile()->dfltEncoding() ); + + if(dlg.exec()) + { + QString strOldData = ""; + if (!node.isNull()) + strOldData = node.toProcessingInstruction().data(); + KCommand *pCmd = new KXEVersionEncodingCommand(this,strOldData,dlg.getData()); + return pCmd; + } + return 0L; +} diff --git a/part/kxedocument.h b/part/kxedocument.h new file mode 100644 index 0000000..2b78659 --- /dev/null +++ b/part/kxedocument.h @@ -0,0 +1,240 @@ +// +// C++ Interface: kxedocument +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef KXEDOCUMENT_H +#define KXEDOCUMENT_H + +#include + +#include +#include +#include +#include + +#define SCHEMA_NAMESPACE "http://www.w3.org/2001/XMLSchema-instance" +#define SCHEMA_ATTRIBUTE "schemaLocation" +#define SCHEMA_ATTRIBUTE_XSI "xsi:schemaLocation" + +class QString; +class KCommand; + + +/** +@file +*/ + +/** +@short Base class for documents in KXMLEditor. + +Stores XML document data which can be manipulated by KXMLEditor application. + + +@author Adam Charytoniuk +*/ +class KXEDocument : public QObject, public QDomDocument, public KXMLGUIClient +{ + Q_OBJECT +public: + /** @short Constructor */ + KXEDocument(QObject *parent=0, const char *name=0); + + /** @short Destructor */ + ~KXEDocument(); + + /** @short Saves document into given file */ + bool save(const QString &); + + /** @short Loads document from given file */ + bool open(const QString &); + + /** @short Sets modification flag. + + Should be called after every operation done on the document content */ + void setModified(bool value=true); + + /** @short Returns true if this document was modified and not saved yet */ + bool isModified() {return m_bIsModified;} + + /** @short Changes document url */ + void setURL(KURL url); + + /** @short Executes given command and adds it into internal document command history list + + @param pCmd pointer to KXECommand object which encapsulates required operations + on a document content + */ + + /** @short Notifies views about creating new element + + @param node newly created node + */ + void updateNodeCreated(const QDomNode & node); + + /** @short Notifies views about deleting node + + This should be called before given node from the document will be deleted. + This will give a chanse to the views to remove that node visualization. + @param node that is going to be deleted + */ + void updateNodeDeleted(const QDomNode & node); + + /** @short Notifies views about element properties changes + + Should be called after element name or element attributes are changed. + @param domElement element that has changed + */ + void updateNodeChanged( const QDomElement & domElement ); + + /** @short Notifies views after change char. data properties + + Should be called after any kind of character data is changed + (including texts, comments, .CDATA sections). + @param node character data node that has changed + */ + void updateNodeChanged( const QDomCharacterData & node ) ; + + /** @short Notifies views after change proc. instr. properties + + Should be called after any processing intruction is changed. + @param domProcInstr processing instruction that has changed + */ + void updateNodeChanged( const QDomProcessingInstruction &domProcInstr ); + + /** @short Notifies views after moving node + + Should be called if any node in the document was moved. + @param node XML node that has been moved + */ + void updateNodeMoved( const QDomNode & node ); + + /** @short Removes spec. processing instruction from XML file. + + @param target name of the proc. instruction target + @warning Removes processing instruction from DomDocument children node list only (no subnodes are modiified). + @sa setSpecProcInstr() + */ + void removeSpecProcInstr(const QString &target); + + /** @short Adds or changes (if already exists) processing instruction. + + Processing instruction will be added as a child in QDomDocument object. + @param target processing intruction target + @param data processing intruction data + @sa removeSpecProcInstr() + */ + virtual void setSpecProcInstr(const QString& target, const QString& data); + + /** @short Returns processing instruction located in QDomDocument. + + If given processing intruction is not found, null node is returned. + @param target name of the processing instruction target. + @sa setSpecProcInstr() + */ + QDomNode getSpecProcInstr(const QString& target); + + /** @short Attaches stylesheet to current XML file. + + If file is already attached to stylesheet, this attachment will be overriten. + @param stylesheet url to stylesheet location + @sa detachStylesheet() + */ + virtual void attachStylesheet(const KURL& stylesheet); + + /** @short Detaches stylesheet from current XML file. + + @sa attachStylesheet()*/ + virtual void detachStylesheet(); + + /** Attaches schema to current XML file. If file is already attached to schema, + this attachment will be overriten. + @param schema url to schema location + @sa detachSchema()*/ + virtual void attachSchema(const KURL& schema); + + /** @short Detaches schema from current XML file. + + @sa attachSchema()*/ + virtual void detachSchema(); + + /** @short prepares content of newly created document. + + The preparation will be done accordingly to settings. + In addition, signal sigOpened() is emited to notify all views + about the change.*/ + virtual void newFile(); + + + /** @short Inserts special proc.instruction into document. */ + KCommand * actVersionEncoding(); + + /** @short Called on user's action response. + + Creates processing instruction + with reference to specified stylesheet URI. + */ + KCommand * actAttachStylesheet(); + + /** @short Called on user's action response. */ + KCommand * actDetachStylesheet(); + + /** @short Called on user's action response */ + KCommand * actDetachSchema(); + + /** @short Called on user's action response */ + KCommand * actAttachSchema(); + +private: + QString m_strCompressedTarEntryName; + /** Equals true if document was opened from compressed file */ + bool m_bDocIsCompressed; + /** @short Stores modification flag */ + bool m_bIsModified; + KURL m_url; + +signals: + /** @short Emmited when document has a new content. + + This may happen in the following scenarios: + - document was opened from the fille or URL, + - document has modified big part of the content + - document initialized it's content after creations + + @sa newFile() + */ + void sigOpened(); + + /** @short Emitted when document content have been changed. + + This allows to notify all attached views about that event.*/ + void sigModified(bool value); + + void sigURLChanged(KURL url); + /** @short Emitted when new node was added to document.*/ + void sigNodeCreated(const QDomNode & node); + /** @short Emitted everytime node was deleted from document.*/ + void sigNodeDeleted(const QDomNode & node); + /** @short Emitted everytime document element was changed .*/ + void sigNodeChanged( const QDomElement & domElement ); + /** @short Emitted everytime character data node was changed. + + This is the case for nodes like: + - text, + - comments, + - CDATA sections, + */ + void sigNodeChanged( const QDomCharacterData & node ) ; + /** @short Emitted everytime processing instruction in document was changed .*/ + void sigNodeChanged( const QDomProcessingInstruction &domProcInstr ); + /** @short Emitted everytime document node was moved was changed .*/ + void sigNodeMoved( const QDomNode & node ); +}; + +#endif diff --git a/part/kxedocument.rc b/part/kxedocument.rc new file mode 100644 index 0000000..b580dee --- /dev/null +++ b/part/kxedocument.rc @@ -0,0 +1,15 @@ + + + + +

    &File + + + + + + + + + + diff --git a/part/kxeelementdialog.cpp b/part/kxeelementdialog.cpp new file mode 100644 index 0000000..b9736b1 --- /dev/null +++ b/part/kxeelementdialog.cpp @@ -0,0 +1,189 @@ +/*************************************************************************** + kxeelementdialog.cpp - description + ------------------- + begin : Mit Apr 17 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxeelementdialog.h" + +#include +#include +#include + +#include +#include +#include + +KXEElementDialog::KXEElementDialog( QWidget * pParent, const char * pszName, bool fModal, WFlags fl ) + : KXEElementDialogBase( pParent, pszName, fModal, fl ) +{ + connect( m_pEditNsURI, SIGNAL(textChanged(const QString&)), this, SLOT(slotNsURIChanged(const QString&)) ); + connect( m_pEditName, SIGNAL(textChanged(const QString&)), this, SLOT(slotNameChanged(const QString&)) ); +} + +void KXEElementDialog::clearDialog() +{ + m_pEditNsURI->clear(); + m_pEditNsURI->setEnabled(true); + m_pEditNsURI->show(); + m_pLblNsURI->setEnabled(true); + m_pLblNsURI->show(); + + m_pEditPrefix->clear(); + m_pEditPrefix->setDisabled(true); + m_pEditPrefix->show(); + m_pLblPrefix->setEnabled(true); + m_pLblPrefix->show(); + + m_pEditName->clear(); + + m_pComboInsert->setCurrentItem(0); +} + +void KXEElementDialog::fillDialog( bool bNsURIIsNull ) +{ + m_pEditNsURI->setDisabled(true); + + if ( bNsURIIsNull ) + { + m_pEditNsURI->hide(); + m_pLblNsURI->hide(); + m_pLblNsURI->setDisabled(true); + + m_pEditPrefix->setDisabled(true); + m_pEditPrefix->hide(); + m_pLblPrefix->hide(); + m_pLblPrefix->setDisabled(true); + } + else + { + m_pEditNsURI->setText( m_strNsURI ); + m_pEditNsURI->show(); + m_pLblNsURI->show(); + m_pLblNsURI->setEnabled(true); + + m_pEditPrefix->setText( m_strPrefix ); + m_pEditPrefix->setEnabled(true); + m_pEditPrefix->show(); + m_pLblPrefix->show(); + m_pLblPrefix->setEnabled(true); + } + + m_pComboInsert->hide(); + m_pComboInsert->setDisabled(true); + m_pLblInsert->hide(); + m_pLblInsert->setDisabled(true); + + m_pEditName->setText( m_strName ); +} + +int KXEElementDialog::exec( bool bEditExisting, bool bRootElement, bool bNsURIIsNull ) +{ + if(bEditExisting) + { + fillDialog( bNsURIIsNull ); + } + else + { + if( bRootElement ) + { + m_pComboInsert->hide(); + m_pComboInsert->setDisabled(true); + m_pLblInsert->hide(); + m_pLblInsert->setDisabled(true); + } + + clearDialog(); + } + + int iReturn = exec(); + if ( iReturn == Accepted ) + { + m_strNsURI = m_pEditNsURI->text(); + m_strPrefix = m_pEditPrefix->text(); + m_strName = m_pEditName->text(); + + m_bAtTop = ( m_pComboInsert->currentItem() == 0 ); + } + + return iReturn; +} + +int KXEElementDialog::exec() +{ + if ( m_pEditName->text().isEmpty() ) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); + + m_pEditName->setFocus(); + m_pBtnOK->setDefault(true); + + return KXEElementDialogBase::exec(); +} + +void KXEElementDialog::slotNsURIChanged( const QString & strNewNsURI ) +{ + if ( strNewNsURI.isEmpty() ) + m_pEditPrefix->setEnabled(false); + else + m_pEditPrefix->setEnabled(true); +} + +void KXEElementDialog::slotNameChanged( const QString & strNewName ) +{ + QString strMessage = checkName(strNewName); + + m_pTextLabelMessage->setText(strMessage); + + if ( strNewName.isEmpty() || (strMessage.length() > 0)) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); +} + +// Check, if XML element name is OK +QString KXEElementDialog::checkName(const QString strElementName) +{ + if(strElementName.length() == 0) + return ""; + + // test for space + if(strElementName.find(' ') >= 0) + return i18n("Element name cannot contain space !"); + + // test for xml, XML ... on start + if(strElementName.find("xml", 0, false) == 0) + return i18n("Element name cannot start with 'xml' or 'XML' !"); + + // check first character + QChar firstChar(strElementName[0]); + if((firstChar != '_') && !firstChar.isLetter()) + { + return i18n("Element name must start with an underscore or a letter !"); + } + + // Forbidden characters + QString strForbiddenChars("&@#$%^()%+?=:<>;\"'*"); + for(unsigned int i = 0; i < strForbiddenChars.length(); i++) + { + QChar ch = strForbiddenChars[i]; + + if(strElementName.find(ch) >= 0) + return i18n("Element name cannot contain character: %1 !").arg(ch); + } + + return ""; +} + diff --git a/part/kxeelementdialog.h b/part/kxeelementdialog.h new file mode 100644 index 0000000..8012525 --- /dev/null +++ b/part/kxeelementdialog.h @@ -0,0 +1,92 @@ +/*************************************************************************** + kxeelementdialog.h - description + ------------------ + begin : Mit Apr 17 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXEELEMENTDIALOG_H +#define KXEELEMENTDIALOG_H + +#include "kxeelementdialogbase.h" + +class KXEElementDialog : public KXEElementDialogBase +{ + Q_OBJECT + + public: + KXEElementDialog( QWidget * pParent = 0, const char * pszName = 0, bool fModal = true, WFlags fl = 0 ); + + public: + + const QString nsURI() const { return m_strNsURI; } + const QString prefix() const { return m_strPrefix; } + const QString name() const { return m_strName; } + const bool atTop() const { return m_bAtTop; } + + void setNsURI(const QString strNsURI) { m_strNsURI = strNsURI; } + void setPrefix(const QString strPrefix) { m_strPrefix = strPrefix; } + void setName(const QString strName) { m_strName = strName; } + + /** + * To be used for creating a new XML element + * + * @return see @ref QDialog::exec + */ + int exec( bool, bool, bool ); + + // check element name + static QString checkName(const QString); + + protected: + /** + * Clears the dialogs widgets (removes their content). + */ + + void clearDialog(); + + /** + * Fills the dialogs widgets with the data members. + */ + void fillDialog( bool ); + + /** + * Don't use this function directly, it's for internal use only. + * Use one of the other @ref DlgXMLElement::exec functions instead. + */ + int exec(); + /** + * Called, when the namespace URI in the edit line @ref DlgXMLElementBase::m_pEditNsURI + * is changed. + * Disables the prefix edit line (@ref DlgXMLElementBase::m_pEditPrefix), + * if the given string is empty. + */ + + + protected slots: + void slotNsURIChanged( const QString & szNewNsURI ); + /** + * Called, when the name in the edit line @ref DlgXMLElementBase::m_pEditName + * is changed. + * Disables the OK button, if the given string is empty. + */ + void slotNameChanged( const QString & szNewName ); + +protected: + QString m_strNsURI; + QString m_strPrefix; + QString m_strName; + bool m_bAtTop; +}; + +#endif diff --git a/part/kxeelementdialogbase.ui b/part/kxeelementdialogbase.ui new file mode 100644 index 0000000..0cf8cac --- /dev/null +++ b/part/kxeelementdialogbase.ui @@ -0,0 +1,339 @@ + +KXEElementDialogBase + + + KXEElementDialogBase + + + + 0 + 0 + 344 + 321 + + + + + 3 + 5 + 0 + 0 + + + + XML Element + + + true + + + + unnamed + + + 11 + + + 6 + + + + Spacer3 + + + Vertical + + + Expanding + + + + 16 + 37 + + + + + + m_pLblPrefix + + + &Prefix: + + + m_pEditPrefix + + + <b>Prefix</b> +<br/> +You can enter the namespace prefix for this XML element here. + + + + + Spacer4 + + + Vertical + + + Expanding + + + + 16 + 37 + + + + + + Spacer5 + + + Vertical + + + Expanding + + + + 16 + 37 + + + + + + m_pEditNsURI + + + <b>Namespace URI</b><br/> +You can enter the namespace URI of this XML element here. + + + + + m_pEditName + + + <b>Local Name</b> +<br/> +You have to enter this XML elements name here. + + + + + m_pEditPrefix + + + <b>Prefix</b> +<br/> +You can enter the namespace prefix for this XML element here. + + + + + m_pLblTagName + + + Local &Name: + + + m_pEditName + + + <b>Local Name</b> +<br/> +You have to enter this XML elements name here. + + + + + m_pLblNsURI + + + Namespace &URI: + + + m_pEditNsURI + + + <b>Namespace URI</b><br/> +You can enter the namespace URI of this XML element here. + + + + + Layout1 + + + + unnamed + + + 0 + + + 6 + + + + Horizontal Spacing2 + + + Horizontal + + + Expanding + + + + 20 + 0 + + + + + + m_pBtnOK + + + &OK + + + Alt+O + + + true + + + true + + + + + m_pBtnCancel + + + &Cancel + + + Alt+C + + + true + + + + + + + Layout4 + + + + unnamed + + + 0 + + + 6 + + + + m_pLblInsert + + + &Insert: + + + m_pComboInsert + + + <b>Insert</b> +<br/> +Choose, where to place this XML element in the parent elements list of childelements. + + + + + + at bottom + + + + + at top + + + + m_pComboInsert + + + <b>Insert</b> +<br/> +Choose, where to place this XML element in the parent elements list of childelements. + + + + + Spacer2 + + + Horizontal + + + Expanding + + + + 181 + 16 + + + + + + + + m_pTextLabelMessage + + + + 255 + 0 + 0 + + + + PlainText + + + + + + + m_pBtnOK + clicked() + KXEElementDialogBase + accept() + + + m_pBtnCancel + clicked() + KXEElementDialogBase + reject() + + + + m_pEditName + m_pComboInsert + m_pBtnOK + m_pBtnCancel + m_pEditNsURI + m_pEditPrefix + + + diff --git a/part/kxefilenewdialog.cpp b/part/kxefilenewdialog.cpp new file mode 100644 index 0000000..807f477 --- /dev/null +++ b/part/kxefilenewdialog.cpp @@ -0,0 +1,29 @@ +// +// C++ Implementation: kxefilenewdialog +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kxefilenewdialog.h" + +#include +#include + +KXEFileNewDialog::KXEFileNewDialog(QWidget* parent, const char* name) + : KXESpecProcInstrDialog(parent, name) +{ + m_pDontShowAgain->show(); + m_pHLine->show(); +} + + +KXEFileNewDialog::~KXEFileNewDialog() +{ +} + + diff --git a/part/kxefilenewdialog.h b/part/kxefilenewdialog.h new file mode 100644 index 0000000..20b3f1b --- /dev/null +++ b/part/kxefilenewdialog.h @@ -0,0 +1,31 @@ +// +// C++ Interface: kxefilenewdialog +// +// Description: +// +// +// Author: Adam Charytoniuk , (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef DLGFILENEW_H +#define DLGFILENEW_H + +#include "kxespecprocinstrdialog.h" + +/** +Dialog for File->New assistance. + +@author Adam Charytoniuk +*/ +class KXEFileNewDialog : public KXESpecProcInstrDialog +{ +public: + KXEFileNewDialog(QWidget* parent, const char* name=0); + + ~KXEFileNewDialog(); + +}; + +#endif diff --git a/part/kxenewfilesettings.cpp b/part/kxenewfilesettings.cpp new file mode 100644 index 0000000..fcd4562 --- /dev/null +++ b/part/kxenewfilesettings.cpp @@ -0,0 +1,207 @@ +/*************************************************************************** + kxenewfilesettings.cpp + ---------------------- + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxenewfilesettings.h" +#include "kxenewfilesettingspage.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +#define CONF_ENTRY_NAME_DFLT_VERSION "Default version" +#define DFLT_VALUE_DFLT_VERSION "1.0" + +#define CONF_ENTRY_NAME_DFLT_ENCODING "Default encoding" +#define DFLT_VALUE_DFLT_ENCODING "UTF-8" + +#define CONF_ENTRY_NAME_DFLT_NEWFILE_CREAT_BEHAVIOUR "Default behaviour" +#define DFLT_VALUE_NEWFILE_CREAT_BEHAVIOUR UseDefaults + + +KXENewFileSettings::KXENewFileSettings( QObject * pParent, const char * pszName ) + : KXESettings( "New File Settings", pParent, pszName ), + m_strDfltVersion( DFLT_VALUE_DFLT_VERSION ), + m_strDfltEncoding( DFLT_VALUE_DFLT_ENCODING ), + m_enmNewFileCreaBehav( DFLT_VALUE_NEWFILE_CREAT_BEHAVIOUR ), + m_pDialogPage(0) +{ +} + + +void KXENewFileSettings::write( KConfig * pConfig ) const +{ + pConfig->writeEntry( CONF_ENTRY_NAME_DFLT_VERSION, m_strDfltVersion ); + pConfig->writeEntry( CONF_ENTRY_NAME_DFLT_ENCODING, m_strDfltEncoding ); + pConfig->writeEntry( CONF_ENTRY_NAME_DFLT_NEWFILE_CREAT_BEHAVIOUR, m_enmNewFileCreaBehav ); +} + + +void KXENewFileSettings::read( const KConfig * pConfig ) +{ + m_strDfltVersion = pConfig->readEntry( CONF_ENTRY_NAME_DFLT_VERSION, DFLT_VALUE_DFLT_VERSION ); + m_strDfltEncoding = pConfig->readEntry( CONF_ENTRY_NAME_DFLT_ENCODING, DFLT_VALUE_DFLT_ENCODING ); + m_enmNewFileCreaBehav = static_cast ( pConfig->readNumEntry( CONF_ENTRY_NAME_DFLT_NEWFILE_CREAT_BEHAVIOUR, DFLT_VALUE_NEWFILE_CREAT_BEHAVIOUR ) ); +} + + +QString KXENewFileSettings::dialogPageName() const +{ + return i18n( "New Files" ); +} + +QString KXENewFileSettings::dialogPageHeader() const +{ + return i18n( "New File Settings" ); +} + +QString KXENewFileSettings::dialogPageIcon() const +{ + return "files"; +} + + +QWidget * KXENewFileSettings::dialogPage( QFrame * pParent ) +{ + + if ( ! m_pDialogPage ) + { + // create the page if necessary + m_pDialogPage = new KXENewFileSettingsPage( pParent, "new files config.dialog page" ); + + // and fill its widgets with the corresponding values + m_pDialogPage->m_pDfltEncoding->insertStringList( encodings() ); + updatePage(); + + connect( m_pDialogPage->m_pDfltVersion, SIGNAL(textChanged(const QString&)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pDfltEncoding, SIGNAL(activated(int)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pNewFileCreatBehav1, SIGNAL(toggled(bool)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pNewFileCreatBehav2, SIGNAL(toggled(bool)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pNewFileCreatBehav3, SIGNAL(toggled(bool)), this, SIGNAL(sigDialogPageChanged()) ); + } + + return m_pDialogPage; +} + +void KXENewFileSettings::setFromPage() +{ + if ( m_pDialogPage ) + { + m_strDfltVersion = m_pDialogPage->m_pDfltVersion->text(); + m_strDfltEncoding = m_pDialogPage->m_pDfltEncoding->currentText(); + + if ( m_pDialogPage->m_pNewFileCreatBehav1->isChecked() ) + m_enmNewFileCreaBehav = CreateEmptyFile; + else if ( m_pDialogPage->m_pNewFileCreatBehav2->isChecked() ) + m_enmNewFileCreaBehav = CreateWithAssistance; + else if ( m_pDialogPage->m_pNewFileCreatBehav3->isChecked() ) + m_enmNewFileCreaBehav = UseDefaults; + } +} + +void KXENewFileSettings::updatePage() const +{ + if ( m_pDialogPage ) + { + m_pDialogPage->m_pDfltVersion->setText( m_strDfltVersion ); + m_pDialogPage->m_pDfltEncoding->setCurrentText( m_strDfltEncoding ); + + switch ( m_enmNewFileCreaBehav ) + { + case CreateEmptyFile: + m_pDialogPage->m_pNewFileCreatBehav->setButton( m_pDialogPage->m_pNewFileCreatBehav->id( m_pDialogPage->m_pNewFileCreatBehav1 ) ); + break; + case CreateWithAssistance: + m_pDialogPage->m_pNewFileCreatBehav->setButton( m_pDialogPage->m_pNewFileCreatBehav->id( m_pDialogPage->m_pNewFileCreatBehav2 ) ); + break; + case UseDefaults: + m_pDialogPage->m_pNewFileCreatBehav->setButton( m_pDialogPage->m_pNewFileCreatBehav->id( m_pDialogPage->m_pNewFileCreatBehav3 ) ); + break; + default: + kdError() << "KXENewFileSettings::updatePage: unknown creation behavior" << endl; + } + } +} + +QStringList KXENewFileSettings::encodings() +{ + static QStringList lstEncs; + if ( lstEncs.empty() ) + { + lstEncs.append("UTF-8"); + lstEncs.append("ISO-8859-1"); + lstEncs.append("ISO-8859-2"); + lstEncs.append("ISO-8859-3"); + lstEncs.append("ISO-8859-4"); + lstEncs.append("ISO-8859-5"); + lstEncs.append("ISO-8859-6"); + lstEncs.append("ISO-8859-7"); + lstEncs.append("ISO-8859-8"); + lstEncs.append("ISO-8859-9"); + } + return lstEncs; +} + + +///////////////////////////////////////////////// +// function(s) to set this settings group data // +///////////////////////////////////////////////// + +void KXENewFileSettings::setNewFileCreaBehav( NewFileCreationBehaviour enmNewFileCreaBehav, KConfig * pConfig ) +{ + // if the data really has been changed + if ( m_enmNewFileCreaBehav != enmNewFileCreaBehav ) + { + // set this object's data to the new one given + m_enmNewFileCreaBehav = enmNewFileCreaBehav; + + // update the corresponding widget in the config.dialog page, if necessary + if ( m_pDialogPage ) + { + blockSignals( true ); + + switch ( enmNewFileCreaBehav ) + { + case CreateEmptyFile: + m_pDialogPage->m_pNewFileCreatBehav->setButton( m_pDialogPage->m_pNewFileCreatBehav->id( m_pDialogPage->m_pNewFileCreatBehav1 ) ); + break; + case CreateWithAssistance: + m_pDialogPage->m_pNewFileCreatBehav->setButton( m_pDialogPage->m_pNewFileCreatBehav->id( m_pDialogPage->m_pNewFileCreatBehav2 ) ); + break; + case UseDefaults: + m_pDialogPage->m_pNewFileCreatBehav->setButton( m_pDialogPage->m_pNewFileCreatBehav->id( m_pDialogPage->m_pNewFileCreatBehav3 ) ); + break; + default: + kdError() << "KXENewFileSettings::dialogPage: unknown creation behavior" << endl; + } + + blockSignals( false ); + } + + // store the new data (only the given one) to the given config file + setConfigGroup( pConfig ); + pConfig->writeEntry( CONF_ENTRY_NAME_DFLT_NEWFILE_CREAT_BEHAVIOUR, m_enmNewFileCreaBehav ); + + // and inform everyone about the changing of our data + emit sigChanged(); + } +} diff --git a/part/kxenewfilesettings.h b/part/kxenewfilesettings.h new file mode 100644 index 0000000..b1203ec --- /dev/null +++ b/part/kxenewfilesettings.h @@ -0,0 +1,111 @@ +/*************************************************************************** + kxenewfilesettings.h + -------------------- + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXENEWFILESETTINGS_H +#define KXENEWFILESETTINGS_H + +#include "kxesettings.h" + +class KXENewFileSettingsPage; + +/** + * This class represents the group of configuration settings for + * new files. + * + * @author Olaf Hartig + */ +class KXENewFileSettings : public KXESettings +{ + public: + + enum NewFileCreationBehaviour + { + CreateEmptyFile, + CreateWithAssistance, + UseDefaults + }; + + KXENewFileSettings( QObject * pParent = 0, const char * pszName = 0 ); + + // The following functions can be used to access this object's settings. + QString dfltVersion() const { return m_strDfltVersion; } + QString dfltEncoding() const { return m_strDfltEncoding; } + NewFileCreationBehaviour newFileCreaBehav() const { return m_enmNewFileCreaBehav; } + + /** + * Returns a list of all possible encodings. + */ + static QStringList encodings(); + + /** + * Sets this object's new file creation behavior to the given one, + * updates the corresponding widget (in the config.dialog page + * @ref m_pDialogPage), stores this value to the given config.file + * and emits the signal @ref KXESettings::sigChanged. + */ + void setNewFileCreaBehav( NewFileCreationBehaviour, KConfig * ); + + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageName() const; + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageHeader() const; + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageIcon() const; + /** + * Derived from @ref KXESettings + */ + virtual QWidget * dialogPage( QFrame * pParent ); + + protected: + + /** + * Derived from @ref KXESettings + */ + virtual void write( KConfig * ) const; + /** + * Derived from @ref KXESettings + */ + virtual void read( const KConfig * ); + /** + * Derived from @ref KXESettings + */ + virtual void setFromPage(); + /** + * Derived from @ref KXESettings + */ + virtual void updatePage() const; + + // the settings itself + QString m_strDfltVersion; + QString m_strDfltEncoding; + NewFileCreationBehaviour m_enmNewFileCreaBehav; + + /** + * the corresponding configuration dialog page + * It is created on demand by @ref dialogPage. + */ + KXENewFileSettingsPage * m_pDialogPage; + +}; + +#endif diff --git a/part/kxenewfilesettingspage.ui b/part/kxenewfilesettingspage.ui new file mode 100644 index 0000000..bf766e8 --- /dev/null +++ b/part/kxenewfilesettingspage.ui @@ -0,0 +1,176 @@ + +KXENewFileSettingsPage + + + KXENewFileSettingsPage + + + + 0 + 0 + 288 + 197 + + + + New File Settings Page + + + + unnamed + + + + layout3 + + + + unnamed + + + + m_pLblDfltVersion + + + XML &version: + + + m_pDfltVersion + + + <b>XML version</b> +<br> +You can determine the default XML version for XML documents being created. This version is the default setting in wizard dialogs.<br> +Since there's only one XML version yet, you shouldn't change this value. + + + + + m_pDfltVersion + + + <b>XML version</b> +<br> +You can determine the default XML version for XML documents being created. This version is the default setting in wizard dialogs.<br> +Since there's only one XML version yet, you shouldn't change this value. + + + + + + + layout4 + + + + unnamed + + + + m_pLblDfltEncoding + + + Default &encoding: + + + m_pDfltEncoding + + + <b>Default encoding</b> +<br> +You can determine the default encoding for XML documents being created. This version is the default setting in wizard dialogs. + + + + + m_pDfltEncoding + + + <b>Default encoding</b> +<br> +You can determine the default encoding for XML documents being created. This version is the default setting in wizard dialogs. + + + + + + + m_pNewFileCreatBehav + + + &Behavior on creating new files + + + true + + + <b>Behavior on creating new files</b> +<br> +You can determine the behavior on creating new XML documents. Choose one of the following:<br> +<br> +<b><i>Start with new empty file</i></b><br> +Creates an empty XML document.<br> +<br> +<b><i>Start with file settings dialog assistance</i></b><br> +Opens a dialog to choose the XML version and encoding of the new document.<br> +<br> +<b><i>Start with new file with default settings</i></b><br> +Creates an XML document with the default XML version and default encoding selected above. + + + + unnamed + + + + m_pNewFileCreatBehav1 + + + Start with new empty file + + + + + m_pNewFileCreatBehav2 + + + Start with file settings dialog assistance + + + true + + + + + m_pNewFileCreatBehav3 + + + Start with new file with default settings + + + false + + + + + + + spacer8 + + + Vertical + + + Expanding + + + + 20 + 20 + + + + + + + diff --git a/part/kxeprintsettings.cpp b/part/kxeprintsettings.cpp new file mode 100644 index 0000000..765102b --- /dev/null +++ b/part/kxeprintsettings.cpp @@ -0,0 +1,134 @@ +/*************************************************************************** + kxeprintsettings.cpp + -------------------- + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxeprintsettings.h" +#include "kxeprintsettingspage.h" + +#include +#include +#include + +#include +#include +#include + +#define CONF_ENTRY_NAME_FONTFAMILY "Print font family" +#define DFLT_VALUE_FONTFAMILY "Courier" + +#define CONF_ENTRY_NAME_FONTSIZE "Print font size" +#define DFLT_VALUE_FONTSIZE 10 + +#define CONF_ENTRY_NAME_INDENT_STEPS "Print indentation" +#define DFLT_VALUE_INDENT_STEPS 2 + +#define CONF_ENTRY_NAME_WITH_FOOTER "Print has footer" +#define DFLT_VALUE_WITH_FOOTER true + +#define CONF_ENTRY_NAME_WITH_HEADER "Print has header" +#define DFLT_VALUE_WITH_HEADER true + + +KXEPrintSettings::KXEPrintSettings( QObject * pParent, const char * pszName ) + : KXESettings( "Print Settings", pParent, pszName ), + m_strFontFamily( DFLT_VALUE_FONTFAMILY ), + m_iFontSize( DFLT_VALUE_FONTSIZE ), + m_iIndentSteps( DFLT_VALUE_INDENT_STEPS ), + m_bWithHeader( DFLT_VALUE_WITH_FOOTER ), + m_bWithFooter( DFLT_VALUE_WITH_HEADER ), + m_pDialogPage(0) +{ +} + + +void KXEPrintSettings::write( KConfig * pConfig ) const +{ + pConfig->writeEntry( CONF_ENTRY_NAME_FONTFAMILY, m_strFontFamily ); + pConfig->writeEntry( CONF_ENTRY_NAME_FONTSIZE, m_iFontSize ); + pConfig->writeEntry( CONF_ENTRY_NAME_INDENT_STEPS, m_iIndentSteps ); + pConfig->writeEntry( CONF_ENTRY_NAME_WITH_FOOTER, m_bWithHeader ); + pConfig->writeEntry( CONF_ENTRY_NAME_WITH_HEADER, m_bWithFooter ); +} + + +void KXEPrintSettings::read( const KConfig * pConfig ) +{ + m_strFontFamily = pConfig->readEntry( CONF_ENTRY_NAME_FONTFAMILY, DFLT_VALUE_FONTFAMILY ); + m_iFontSize = pConfig->readNumEntry( CONF_ENTRY_NAME_FONTSIZE, DFLT_VALUE_FONTSIZE ); + m_iIndentSteps = pConfig->readNumEntry( CONF_ENTRY_NAME_INDENT_STEPS, DFLT_VALUE_INDENT_STEPS ); + m_bWithHeader = pConfig->readBoolEntry( CONF_ENTRY_NAME_WITH_FOOTER, DFLT_VALUE_WITH_FOOTER ); + m_bWithFooter = pConfig->readBoolEntry( CONF_ENTRY_NAME_WITH_HEADER, DFLT_VALUE_WITH_HEADER ); +} + +QString KXEPrintSettings::dialogPageName() const +{ + return i18n( "Printing" ); +} + +QString KXEPrintSettings::dialogPageHeader() const +{ + return i18n( "Print Settings" ); +} + +QString KXEPrintSettings::dialogPageIcon() const +{ + return "printer2"; +} + +QWidget * KXEPrintSettings::dialogPage( QFrame * pParent ) +{ + if ( ! m_pDialogPage ) + { + // create the page if necessary + m_pDialogPage = new KXEPrintSettingsPage( pParent, "printing config.dialog page" ); + + // and fill its widgets with the corresponding values + updatePage(); + + connect( m_pDialogPage->m_pFontFamily, SIGNAL(activated(int)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pFontSize, SIGNAL(valueChanged(int)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pIndentSteps, SIGNAL(valueChanged(int)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pWithHeader, SIGNAL(toggled(bool)), this, SIGNAL(sigDialogPageChanged()) ); + connect( m_pDialogPage->m_pWithFooter, SIGNAL(toggled(bool)), this, SIGNAL(sigDialogPageChanged()) ); + } + + return m_pDialogPage; +} + + +void KXEPrintSettings::setFromPage() +{ + if ( m_pDialogPage ) + { + m_strFontFamily = m_pDialogPage->m_pFontFamily->currentText(); + m_iFontSize = m_pDialogPage->m_pFontSize->value(); + m_iIndentSteps = m_pDialogPage->m_pIndentSteps->value(); + m_bWithHeader = m_pDialogPage->m_pWithHeader->isChecked(); + m_bWithFooter = m_pDialogPage->m_pWithFooter->isChecked(); + } +} + +void KXEPrintSettings::updatePage() const +{ + if ( m_pDialogPage ) + { + m_pDialogPage->m_pFontFamily->setCurrentFont( m_strFontFamily ); + m_pDialogPage->m_pFontSize->setValue( m_iFontSize ); + m_pDialogPage->m_pIndentSteps->setValue( m_iIndentSteps ); + m_pDialogPage->m_pWithHeader->setChecked( m_bWithHeader ); + m_pDialogPage->m_pWithFooter->setChecked( m_bWithFooter ); + } +} diff --git a/part/kxeprintsettings.h b/part/kxeprintsettings.h new file mode 100644 index 0000000..fb833f6 --- /dev/null +++ b/part/kxeprintsettings.h @@ -0,0 +1,95 @@ +/*************************************************************************** + kxeprintsettings.h + ------------------ + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXEPRINTSETTINGS_H +#define KXEPRINTSETTINGS_H + +#include "kxesettings.h" + +class KXEPrintSettingsPage; + +/** + * This class represents the group of configuration settings for + * printing. + * + * @author Olaf Hartig + */ +class KXEPrintSettings : public KXESettings +{ + public: + + KXEPrintSettings( QObject * pParent = 0, const char * pszName = 0 ); + + // The following functions can be used to access this object's settings. + QString fontFamily() const { return m_strFontFamily; } + int fontSize() const { return m_iFontSize; } + int indentSteps() const { return m_iIndentSteps; } + bool hasHeader() const { return m_bWithHeader; } + bool hasFooter() const { return m_bWithFooter; } + + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageName() const; + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageHeader() const; + /** + * Derived from @ref KXESettings + */ + virtual QString dialogPageIcon() const; + /** + * Derived from @ref KXESettings + */ + virtual QWidget * dialogPage( QFrame * pParent ); + + protected: + + /** + * Derived from @ref KXESettings + */ + virtual void write( KConfig * ) const; + /** + * Derived from @ref KXESettings + */ + virtual void read( const KConfig * ); + /** + * Derived from @ref KXESettings + */ + virtual void setFromPage(); + /** + * Derived from @ref KXESettings + */ + virtual void updatePage() const; + + // the settings itself + QString m_strFontFamily; + int m_iFontSize; + int m_iIndentSteps; + bool m_bWithHeader; + bool m_bWithFooter; + + /** + * the corresponding configuration dialog page + * It is created on demand by @ref dialogPage. + */ + KXEPrintSettingsPage * m_pDialogPage; + +}; + +#endif diff --git a/part/kxeprintsettingspage.ui b/part/kxeprintsettingspage.ui new file mode 100644 index 0000000..a857413 --- /dev/null +++ b/part/kxeprintsettingspage.ui @@ -0,0 +1,228 @@ + +KXEPrintSettingsPage + + + KXEPrintSettingsPage + + + + 0 + 0 + 292 + 187 + + + + Print Settings Page + + + + unnamed + + + + m_pLblFontFamily + + + NoFrame + + + Plain + + + Font &family: + + + m_pFontFamily + + + <b>Font family</b> +<br> +Choose the font family you want to be used on printing your XML documents. + + + + + m_pFontFamily + + + <b>Font family</b> +<br> +Choose the font family you want to be used on printing your XML documents. + + + + + layout3 + + + + unnamed + + + + m_pLblFontSize + + + Font &size: + + + m_pFontSize + + + <b>Font size</b> +<br> +Choose the font size you want to be used on printing your XML documents. + + + + + m_pFontSize + + + pt + + + + + + 6 + + + 10 + + + <b>Font size</b> +<br> +Choose the font size you want to be used on printing your XML documents. + + + + + spacer3 + + + Horizontal + + + Expanding + + + + 31 + 20 + + + + + + + + layout4 + + + + unnamed + + + + m_pLblIndentSteps + + + Element &indentation: + + + m_pIndentSteps + + + <b>Element indentation</b> +<br> +Choose the number of characters you want to be used for indenting childnodes on printing you XML documents. + + + + + m_pIndentSteps + + + <b>Element indentation</b> +<br> +Choose the number of characters you want to be used for indenting childnodes on printing you XML documents. + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 41 + 20 + + + + + + + + m_pWithHeader + + + &Print header + + + Alt+P + + + <b>Print header</b> +<br> +You can determine wether you want a header to be printed on every page when printing you XML documents or not. + + + + + m_pWithFooter + + + P&rint footer + + + Alt+R + + + <b>Print footer</b> +<br> +You can determine wether you want a footline to be printed on every page when printing you XML documents or not. + + + + + spacer10 + + + Vertical + + + Expanding + + + + 20 + 20 + + + + + + + + kfontcombo.h + klineedit.h + + diff --git a/part/kxeprocinstrdialog.cpp b/part/kxeprocinstrdialog.cpp new file mode 100644 index 0000000..7ddbf21 --- /dev/null +++ b/part/kxeprocinstrdialog.cpp @@ -0,0 +1,183 @@ +/*************************************************************************** + kxeprocinstrdialog.cpp - description + ------------------- + begin : Mit Apr 24 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxeprocinstrdialog.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +KXEProcInstrDialog::KXEProcInstrDialog( QWidget * pParent, const char * pszName, bool fModal, WFlags fl ) + : KXEProcInstrDialogBase( pParent, pszName, fModal, fl ) +{ + // signals and slots connections + connect( m_pBtnOK, SIGNAL( clicked() ), this, SLOT( slotAccept() ) ); + connect( m_pEditData, SIGNAL(textChanged()), this, SLOT(slotDataChanged()) ); + connect( m_pEditTarget, SIGNAL(textChanged(const QString &)), this, SLOT(slotTargetChanged(const QString &)) ); +} + + +void KXEProcInstrDialog::clearDialog() +{ + m_pEditTarget->clear(); + m_pEditData->clear(); +} + + +int KXEProcInstrDialog::exec( bool bEditExisting, bool bParentIsDocument ) +{ + if(bEditExisting) + { + m_pComboInsert->hide(); + m_pComboInsert->setDisabled(true); + m_pLblInsert->hide(); + m_pLblInsert->setDisabled(true); + + m_pEditTarget->setDisabled(true); + + m_pEditTarget->setText( m_strTarget ); + m_pEditData->setText( m_strData ); + } + else + { + if ( bParentIsDocument ) + { + m_pComboInsert->hide(); + m_pComboInsert->setDisabled(true); + m_pLblInsert->hide(); + m_pLblInsert->setDisabled(true); + } + m_pEditTarget->setEnabled(true); + clearDialog(); + } + + int iReturn = exec(); + if ( iReturn == Accepted ) + { + m_bAtTop = ( m_pComboInsert->currentItem() == 0 ); + m_strTarget = m_pEditTarget->text(); + m_strData = m_pEditData->text(); + } + + return iReturn; +} + +int KXEProcInstrDialog::exec() +{ + if ( m_pEditTarget->text().isEmpty() ) + m_pBtnOK->setEnabled(false); + else + m_pBtnOK->setEnabled(true); + + if ( m_pEditTarget->isEnabled() ) + m_pEditTarget->setFocus(); + else + m_pEditData->setFocus(); + + m_pBtnOK->setDefault(true); + + return KXEProcInstrDialogBase::exec(); +} + +void KXEProcInstrDialog::slotDataChanged() +{ + QString strMessage = checkData(m_pEditData->text()); + if(strMessage.isEmpty()) + strMessage = checkTarget(m_pEditTarget->text()); + + m_pTextLabelMessage->setText(strMessage); + + if ( m_pEditData->text().isEmpty() || + m_pEditTarget->text().isEmpty() || + (strMessage.length() > 0) + ) + m_pBtnOK->setDisabled(true); + else + m_pBtnOK->setEnabled(true); +} + +void KXEProcInstrDialog::slotTargetChanged(const QString &strNewTarget) +{ + QString strMessage = checkTarget(strNewTarget); + if(strMessage.isEmpty()) + strMessage = checkData(m_pEditData->text()); + + m_pTextLabelMessage->setText(strMessage); + + if ( m_pEditData->text().isEmpty() || + strNewTarget.isEmpty() || + (strMessage.length() > 0) + ) + m_pBtnOK->setDisabled(true); + else + m_pBtnOK->setEnabled(true); +} + +/** Called when user press OK button */ +void KXEProcInstrDialog::slotAccept() +{ + if(m_pEditTarget->text() == "xml") + { KMessageBox::sorry(this, i18n("Pleasse use menu item File -> Version and encoding for this processing instruction !")); + return; + } + + accept(); +} + +// Check, if XML proc. instr. target is OK +QString KXEProcInstrDialog::checkTarget(const QString strTarget) +{ + if(strTarget.length() == 0) + return ""; + + // Forbidden characters + QString strForbiddenChars("<>"); + for(unsigned int i = 0; i < strForbiddenChars.length(); i++) + { + QChar ch = strForbiddenChars[i]; + + if(strTarget.find(ch) >= 0) + return i18n("Target cannot contain character: %1 !").arg(ch); + } + + return ""; +} + +// Check, if XML proc. instr. data is OK +QString KXEProcInstrDialog::checkData(const QString strData) +{ + if(strData.length() == 0) + return ""; + + // Forbidden characters + QString strForbiddenChars("<>"); + for(unsigned int i = 0; i < strForbiddenChars.length(); i++) + { + QChar ch = strForbiddenChars[i]; + + if(strData.find(ch) >= 0) + return i18n("Contents cannot contain character: %1 !").arg(ch); + } + + return ""; +} diff --git a/part/kxeprocinstrdialog.h b/part/kxeprocinstrdialog.h new file mode 100644 index 0000000..5b4de2e --- /dev/null +++ b/part/kxeprocinstrdialog.h @@ -0,0 +1,87 @@ +/*************************************************************************** + kxeprocinstrdialog.h - description + -------------------- + begin : Mit Apr 24 2002 + copyright : (C) 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXEPROCINSTRDIALOG_H +#define KXEPROCINSTRDIALOG_H + +#include "kxeprocinstrdialogbase.h" + +class KXEProcInstrDialog : public KXEProcInstrDialogBase +{ + Q_OBJECT + + public: + KXEProcInstrDialog( QWidget * pParent = 0, const char * pszName = 0, bool fModal = true, WFlags fl = 0 ); + + const bool atTop() const { return m_bAtTop; } + const QString target() const { return m_strTarget; } + const QString data() const { return m_strData; } + + void setTarget(const QString strTarget) { m_strTarget = strTarget; } + void setData(const QString strData) { m_strData = strData; } + + public: + + /** + * To be used for inserting a proc.instruction as child + * of the given parent node. + * + * @return see @ref QDialog::exec + */ + int exec( bool, bool ); + + /** + * Clears the dialogs widgets. + */ + void clearDialog(); + + // check target + static QString checkTarget(const QString); + + // check data + static QString checkData(const QString); + + protected: + /** + * Don't use this function directly, it's for internal use only. + * Use one of the other @ref KXEProcInstrDialog::exec functions instead. + */ + int exec(); + + protected slots: + /** + * Called, when the data edit box is changed. + * Disables the OK button, if the editbox is empty. + */ + void slotDataChanged(); + + /** + * Called, when the target edit box is changed. + * Disables the OK button, if the editbox is empty. + */ + void slotTargetChanged(const QString &); + + /** Called when user press OK button */ + void slotAccept(); + + protected: + QString m_strTarget; + QString m_strData; + bool m_bAtTop; +}; + +#endif diff --git a/part/kxeprocinstrdialogbase.ui b/part/kxeprocinstrdialogbase.ui new file mode 100644 index 0000000..c77d10b --- /dev/null +++ b/part/kxeprocinstrdialogbase.ui @@ -0,0 +1,223 @@ + +KXEProcInstrDialogBase + + + KXEProcInstrDialogBase + + + + 0 + 0 + 367 + 244 + + + + Processing Instruction + + + true + + + + unnamed + + + 11 + + + 6 + + + + layout4 + + + + unnamed + + + + m_pLblTarget + + + &Target: + + + m_pEditTarget + + + <b>Target</b><br/> +Define the target of this processing instruction here. + + + + + m_pEditTarget + + + <b>Target</b><br/> +Define the target of this processing instruction here. + + + + + Spacer2 + + + Horizontal + + + Expanding + + + + 60 + 20 + + + + + + m_pLblInsert + + + &Insert: + + + m_pComboInsert + + + <b>Insert</b> +<br/> +Choose, where to place this processing instruction in the parent elements list. + + + + + + at bottom + + + + + at top + + + + m_pComboInsert + + + <b>Insert</b> +<br/> +Choose, where to place this processing instruction in the parent elements list. + + + + + + + m_pEditData + + + NoWrap + + + Here you can enter the data (the instructions) of this XML processing instruction. + + + + + Layout1 + + + + unnamed + + + 0 + + + 6 + + + + Horizontal Spacing2 + + + Horizontal + + + Expanding + + + + 20 + 20 + + + + + + m_pBtnOK + + + &OK + + + Alt+O + + + true + + + true + + + + + m_pBtnCancel + + + &Cancel + + + Alt+C + + + true + + + + + + + m_pTextLabelMessage + + + + 255 + 0 + 0 + + + + + + + + m_pBtnCancel + clicked() + KXEProcInstrDialogBase + reject() + + + + m_pEditTarget + m_pComboInsert + m_pEditData + m_pBtnOK + m_pBtnCancel + + + diff --git a/part/kxesearchdialog.cpp b/part/kxesearchdialog.cpp new file mode 100644 index 0000000..5830e96 --- /dev/null +++ b/part/kxesearchdialog.cpp @@ -0,0 +1,56 @@ +/*************************************************************************** + kxesearchdialog.cpp - description + ------------------- + begin : Tue Jul 10 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxesearchdialog.h" + +#include + +KXESearchDialog::KXESearchDialog(QWidget *parent, const char *name, bool modal) + : KXESearchDialogBase(parent, name, modal) +{ + m_pPushButtonFind->setEnabled(false); + m_pEditSearchedString->setFocus(); + m_pPushButtonFind->setDefault(true); +} + +void KXESearchDialog::slotTextChanged(const QString& string) +{ + if ( string.isEmpty() ) + m_pPushButtonFind->setEnabled(false); + else + m_pPushButtonFind->setEnabled(true); + + toggleAcceptButton(); +} + +void KXESearchDialog::slotFindInChanged() +{ + toggleAcceptButton(); +} + +void KXESearchDialog::toggleAcceptButton() +{ + if ( (m_pCheckBoxElementNames->isChecked()) ||(m_pCheckBoxAttributeNames->isChecked()) || (m_pCheckBoxAttributeValues->isChecked()) || (m_pCheckBoxContents->isChecked()) ) + { + if ( m_pEditSearchedString->text().isEmpty() ) + m_pPushButtonFind->setEnabled(false); + else + m_pPushButtonFind->setEnabled(true); + } + else + m_pPushButtonFind->setEnabled(false); +} diff --git a/part/kxesearchdialog.h b/part/kxesearchdialog.h new file mode 100644 index 0000000..abe7f3d --- /dev/null +++ b/part/kxesearchdialog.h @@ -0,0 +1,57 @@ +/*************************************************************************** + kxesearchdialog.h - description + ----------------- + begin : Tue Jul 10 2001 + copyright : (C) 2001, 2002, 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXESEARCHDIALOG_H +#define KXESEARCHDIALOG_H + +#include "kxesearchdialogbase.h" + +#include +#include + +/** + * Dialog for input information from user + * about searching in XML document + */ +// TODO add possibility to search backwards +class KXESearchDialog : public KXESearchDialogBase +{ + Q_OBJECT + + public: + KXESearchDialog( QWidget * pParent, const char * pszName = 0, bool bModal = true ); + + QString getSearchString() const { return m_pEditSearchedString->text(); } + bool getMatchCase() const { return m_pCheckBoxMatchCase->isChecked(); } + bool getInElementNames() const { return m_pCheckBoxElementNames->isChecked(); } + bool getInAttributeNames() const { return m_pCheckBoxAttributeNames->isChecked(); } + bool getInAttributeValues() const { return m_pCheckBoxAttributeValues->isChecked(); } + bool getInContents() const { return m_pCheckBoxContents->isChecked(); } + + protected: + /** Enables/Disables the "Find"-button. */ + void toggleAcceptButton(); + + protected slots: + /** Called when text in edit line is changed */ + virtual void slotTextChanged(const QString & ); + + /** Called on a change of the "find in" checkbuttons. */ + virtual void slotFindInChanged(); +}; + +#endif diff --git a/part/kxesearchdialogbase.ui b/part/kxesearchdialogbase.ui new file mode 100644 index 0000000..23be699 --- /dev/null +++ b/part/kxesearchdialogbase.ui @@ -0,0 +1,350 @@ + +KXESearchDialogBase +Dialog for input information from user +about searching in XML document +Lumir Vanek + + + KXESearchDialogBase + + + + 0 + 0 + 354 + 244 + + + + + 330 + 240 + + + + + 0 + 0 + + + + Search + + + + unnamed + + + 11 + + + 6 + + + + Layout5 + + + + unnamed + + + 0 + + + 6 + + + + m_pTextLabelSearchedString + + + MShape + + + MShadow + + + &Search string: + + + m_pEditSearchedString + + + <b>Search string</b></br> +Here you can enter the string you want to search for in your XML document. + + + + + Spacer3 + + + Horizontal + + + Expanding + + + + 262 + 0 + + + + + + + + m_pEditSearchedString + + + <b>Search string</b></br> +Here you can enter the string you want to search for in your XML document. + + + + + layout13 + + + + unnamed + + + + Spacer2 + + + Horizontal + + + Expanding + + + + 154 + 16 + + + + + + m_pPushButtonFind + + + &Find + + + + + m_pPushButtonCancel + + + &Cancel + + + + + + + Spacer9 + + + Vertical + + + Expanding + + + + 16 + 131 + + + + + + m_pGroupBoxSearchIn + + + Find &in + + + <b>Find in</b> +<br/> +Here you can choose the parts of your XML document that should be inspected during the search. +<br/> +These are +<br/> +<br/> +<b><i>Element names</i></b><br/> +<b><i>Attribute names</i></b><br/> +<b><i>Attribute values</i></b><br/> +<b><i>Content</i></b> + + + + unnamed + + + 11 + + + 6 + + + + m_pCheckBoxElementNames + + + Element names + + + + + m_pCheckBoxAttributeNames + + + Attribute names + + + + + m_pCheckBoxAttributeValues + + + Attribute values + + + + + m_pCheckBoxContents + + + Content + + + + + + + layout23 + + + + unnamed + + + + spacer19 + + + Horizontal + + + Expanding + + + + 18 + 20 + + + + + + m_pCheckBoxMatchCase + + + &Match case + + + Alt+M + + + <b>Match case</b><br/> +Check this for case sensitive search. + + + + + spacer20 + + + Horizontal + + + Expanding + + + + 19 + 20 + + + + + + + + + + m_pEditSearchedString + textChanged(const QString&) + KXESearchDialogBase + slotTextChanged(const QString&) + + + m_pPushButtonCancel + clicked() + KXESearchDialogBase + reject() + + + m_pPushButtonFind + clicked() + KXESearchDialogBase + accept() + + + m_pCheckBoxElementNames + stateChanged(int) + KXESearchDialogBase + slotFindInChanged() + + + m_pCheckBoxAttributeNames + stateChanged(int) + KXESearchDialogBase + slotFindInChanged() + + + m_pCheckBoxAttributeValues + stateChanged(int) + KXESearchDialogBase + slotFindInChanged() + + + m_pCheckBoxContents + stateChanged(int) + KXESearchDialogBase + slotFindInChanged() + + + + m_pEditSearchedString + m_pCheckBoxElementNames + m_pCheckBoxAttributeNames + m_pCheckBoxAttributeValues + m_pCheckBoxContents + m_pCheckBoxMatchCase + m_pPushButtonFind + m_pPushButtonCancel + + + slotFindInChanged() + slotTextChanged(const QString &) + + + diff --git a/part/kxesettings.cpp b/part/kxesettings.cpp new file mode 100644 index 0000000..013e73f --- /dev/null +++ b/part/kxesettings.cpp @@ -0,0 +1,67 @@ +/*************************************************************************** + kxesettings.cpp + --------------- + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxesettings.h" + +#include + +KXESettings::KXESettings( const QString & strConfigGroup, QObject * pParent, const char * pszName ) + : QObject( pParent, pszName ), + m_bPageChanged( false ), + m_strConfigGroup( strConfigGroup ) +{ + connect( this, SIGNAL(sigDialogPageChanged()), this, SLOT(slotDialogPageChanged()) ); +} + +void KXESettings::setConfigGroup( KConfig * pConfig ) const +{ + pConfig->setGroup( m_strConfigGroup ); +} + +void KXESettings::store( KConfig * pConfig ) const +{ + setConfigGroup( pConfig ); + write( pConfig ); +} + +void KXESettings::restore( KConfig * pConfig ) +{ + setConfigGroup( pConfig ); + read( pConfig ); + + // update the corresponding config.dialog page + blockSignals( true ); // block this object's signals (especially sigDialogPageChanged) + updatePage(); + blockSignals( false ); // unblock the signals + + emit sigChanged(); +} + +void KXESettings::slotDialogPageChanged() +{ + m_bPageChanged = true; +} + +void KXESettings::apply() +{ + if ( m_bPageChanged ) + { + setFromPage(); + m_bPageChanged = false; + emit sigChanged(); + } +} diff --git a/part/kxesettings.h b/part/kxesettings.h new file mode 100644 index 0000000..804c63e --- /dev/null +++ b/part/kxesettings.h @@ -0,0 +1,175 @@ +/*************************************************************************** + kxesettings.h + ------------- + begin : Tue Dec 02 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : hartig@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXESETTINGS_H +#define KXESETTINGS_H + +#include + +class KConfig; +class QFrame; + +/** + * This is an abstract base class for classes representing a group, that stores + * several configuration settings and manages a corresponding page in the + * configuration dialog. + * + * @author Olaf Hartig + */ +class KXESettings : public QObject +{ + Q_OBJECT + + public: + + /** + * the constructor + * + * @param strConfigGroup the name of the corresponding group in the config file, + * it is copied to the member @ref m_strConfigGroup + */ + KXESettings( const QString & strConfigGroup, QObject * pParent = 0, const char * pszName = 0 ); + + /** + * Stores this settings to the given @ref KConfig object, by doing the + * following things: + * + * - set the config group by calling @ref setConfigGroup + * - write the data to the given @ref KConfig object by calling @ref write + * (which is implemented in the child class) + */ + void store( KConfig * ) const; + /** + * Restores the settings from the given @ref KConfig object, by doing + * following things: + * + * - set the config group by calling @ref setConfigGroup + * - read the data from the given @ref KConfig object by calling @ref read + * (which is implemented in the child class) + * - try to update the corresponding config.page by calling @ref updatePage + * (implemented in the child class) + * - emit the signal sigChanged + */ + void restore( KConfig * ); + /** + * If the data in the corresponding configuration dialog page has been + * changed (@ref m_bPageChanged), this data gets applied by the + * @ref setFromPage member function implemented in child classes, + * the flag @ref m_bPageChanged is reset (to false) and the signal + * sigChanged is emitted. + */ + void apply(); + + /** + * Override this function and return the name of the corresponding + * configuration dialog page. This is the name used in the list of + * pages in the configuration dialog. + * This name has to be internationalized. + */ + virtual QString dialogPageName() const = 0; + /** + * You can override this function and return a header line to + * be used for the corresponding configuration dialog page. + * If it's not overridden, the pages name is used (see + * @ref dialogPageName) + * This string has to be internationalized. + */ + virtual QString dialogPageHeader() const { return QString::null; } + /** + * Override this function and return the (file-)name of the icon + * to be used in the configuration dialog for the corresponding page. + */ + virtual QString dialogPageIcon() const = 0; + /** + * Override this function to create the corresponding configuration + * dialog page with the given parent and return it. + * Update the page's widgets (usually by using @ref updatePage). + * Connect the signal @ref sigDialogPageChanged to the page's + * data changed signal(s). + */ + virtual QWidget * dialogPage( QFrame * pParent ) = 0; + + + signals: + + /** + * This signal is always emitted when the settings change. + * It is emitted by @ref restore and @ref apply. + */ + void sigChanged(); + /** + * Emitted, when the data in the corresponding dialog page + * has been changed. + * Connect this signal to the page's changed signal in your + * child class in @ref dialogPage. + */ + void sigDialogPageChanged(); + + protected: + + /** + * Overide this function and write your settings to the given KConfig object. + * You mustn't change the config group. + */ + virtual void write( KConfig * ) const = 0; + /** + * Overide this function and read the settings from the given KConfig object. + * You mustn't change the config group. + */ + virtual void read( const KConfig * ) = 0; + /** + * Override this function to set this object's data to the data in the + * corresponding configuration dialog page, if a page has already been + * created (check this!). + */ + virtual void setFromPage() = 0; + /** + * Override this function to update the widgets in the corresponding + * configuration dialog page with the current data (from your child class + * object), if a page has already been created (check this!). + */ + virtual void updatePage() const = 0; + + /** + * Sets the config group of the given @ref KConfig object to + * this setting's config group (@ref m_strConfigGroup). + */ + void setConfigGroup( KConfig * ) const; + + /** + * This flag is set to true if the data in the corresponding configuration + * dialog's page has been changed but not applied yet. + */ + bool m_bPageChanged; + + protected slots: + + /** + * Sets the flag @ref m_bPageChanged to true. + */ + void slotDialogPageChanged(); + + private: + + /** + * name of the config group for this group of settings + */ + const QString m_strConfigGroup; + +}; + +#endif diff --git a/part/kxespecprocinstrdialog.cpp b/part/kxespecprocinstrdialog.cpp new file mode 100644 index 0000000..09f1224 --- /dev/null +++ b/part/kxespecprocinstrdialog.cpp @@ -0,0 +1,135 @@ +/*************************************************************************** + kxespecprocinstrdialog.cpp - description + -------------------------- + begin : Ne ?ec 6 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxespecprocinstrdialog.h" + +#include "kxmleditorfactory.h" +#include "kxeconfiguration.h" +#include "kxenewfilesettings.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +KXESpecProcInstrDialog::KXESpecProcInstrDialog(QWidget *parent, const char *name ) + : KXESpecProcInstrDialogBase(parent,name) +{ + m_pComboBoxEncoding->insertStringList( KXMLEditorFactory::configuration()->newfile()->encodings() ); + + m_pLineEditVersion->setText("1.0"); + + m_pHLine->hide(); + m_pDontShowAgain->hide(); + + // signals and slots connections + connect( m_pBtnOK, SIGNAL( clicked() ), this, SLOT( slotAccept() ) ); +} + +KXESpecProcInstrDialog::~KXESpecProcInstrDialog() +{ +} + +void KXESpecProcInstrDialog::fillDialog( const QString strData ) +{ + QString strVersion; + QString strEncoding; + + int iStart, iEnd; + + // find version info + if((iStart = strData.find("version", 0)) >= 0) + { + // info about encoding found; + iStart += 7; // skip version + + // search " or ' after encoding + if((iStart = strData.find(QRegExp("[\"']"), iStart)) > 0) + { + QChar ch = strData[iStart]; + iStart++; // skip ch + if((iEnd = strData.find(ch, iStart)) > 0) + strVersion = strData.mid(iStart, iEnd - iStart); + } + } + else + strVersion = "1.0"; + + // find encoding info + if((iStart = strData.find("encoding", 0)) >= 0) + { + // info about encoding found; + iStart += 8; // skip encoding + + // search " or ' after encoding + if((iStart = strData.find(QRegExp("[\"']"), iStart)) > 0) + { + QChar ch = strData[iStart]; + iStart++; // skip ch + if((iEnd = strData.find(ch, iStart)) > 0) + strEncoding = strData.mid(iStart, iEnd - iStart); + } + } + else + strEncoding = "UTF-8"; + + + m_pLineEditVersion->setText(strVersion); + m_pComboBoxEncoding->setCurrentText(strEncoding); +} + +int KXESpecProcInstrDialog::exec() +{ + m_pBtnOK->setDefault(true); + + return KXESpecProcInstrDialogBase::exec(); +} + + +/** Called when user press OK button */ +void KXESpecProcInstrDialog::slotAccept() +{ + accept(); +} + + +/*! + Initializes content of dialog controls with specified values. + @param version XML file version + @param encoding encoding type for the XML file + */ +void KXESpecProcInstrDialog::fillDialog(const QString& version, const QString& encoding) +{ + + m_pLineEditVersion->setText(version); + m_pComboBoxEncoding->setCurrentText(encoding); +} + + +/*! + Returns content of the dialog as an string of format: '"version = '...' encoding = '...' ". + */ +QString KXESpecProcInstrDialog::getData() +{ + return QString("version = '")+m_pLineEditVersion->text()+ + "' encoding = '"+m_pComboBoxEncoding->currentText()+"' "; +} diff --git a/part/kxespecprocinstrdialog.h b/part/kxespecprocinstrdialog.h new file mode 100644 index 0000000..c78301f --- /dev/null +++ b/part/kxespecprocinstrdialog.h @@ -0,0 +1,54 @@ +/*************************************************************************** + kxespecprocinstrdialog.h - description + ------------------------ + begin : Ne ?ec 6 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : lvanek@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KXESPECPROCINSTRDIALOG_H +#define KXESPECPROCINSTRDIALOG_H + +#include "kxespecprocinstrdialogbase.h" + +#include + +/** + *@author Lumir Vanek + */ + +class KXESpecProcInstrDialog : public KXESpecProcInstrDialogBase +{ + Q_OBJECT + +public: + KXESpecProcInstrDialog(QWidget *parent=0, const char *name=0); + ~KXESpecProcInstrDialog(); + + QString getData(); + + /** Initialize dialog from given target and data string */ + void fillDialog(const QString&, const QString&); + + /** Initialize dialog from given data string */ + void fillDialog(const QString); + + int exec(); + +protected slots: + + /** Called when user press OK button */ + void slotAccept(); + +}; + +#endif diff --git a/part/kxespecprocinstrdialogbase.ui b/part/kxespecprocinstrdialogbase.ui new file mode 100644 index 0000000..1bcbb25 --- /dev/null +++ b/part/kxespecprocinstrdialogbase.ui @@ -0,0 +1,191 @@ + +KXESpecProcInstrDialogBase +Lumir Vanek + + + KXESpecProcInstrDialogBase + + + + 0 + 0 + 216 + 191 + + + + + 5 + 5 + 0 + 0 + + + + Special processing instruction + + + + unnamed + + + 11 + + + 6 + + + + m_pTextLabel1 + + + XML &version: + + + m_pLineEditVersion + + + <b>XML version</b><br/> +You can determine the XML version for XML document. + + + + + m_pLineEditVersion + + + <b>XML version</b><br/> +You can determine the XML version for XML document. + + + + + m_pTextLabel2 + + + &Encoding: + + + m_pComboBoxEncoding + + + <b>Encoding</b><br/> +You can determine the encoding used while saving this XML document. + + + + + m_pComboBoxEncoding + + + true + + + <b>Encoding</b><br/> +You can determine the encoding used while saving this XML document. + + + + + layout4 + + + + unnamed + + + + m_pDontShowAgain + + + Do not show this dialog again + + + Ctrl+T + + + <b>Do not show this dialog again</b><br/> +If you select this option, your choice will be remembered. Next time you create a new file, you won't be disturbed by this dialog box. + + + + + + + m_pHLine + + + HLine + + + Raised + + + + + layout2 + + + + unnamed + + + + spacer1 + + + Horizontal + + + Expanding + + + + 40 + 20 + + + + + + m_pBtnOK + + + &OK + + + true + + + + + m_pBtnCancel + + + &Cancel + + + false + + + + + + + + + m_pBtnCancel + clicked() + KXESpecProcInstrDialogBase + reject() + + + + m_pLineEditVersion + m_pComboBoxEncoding + m_pDontShowAgain + m_pBtnOK + m_pBtnCancel + + + diff --git a/part/kxesyntaxhighlighter.cpp b/part/kxesyntaxhighlighter.cpp new file mode 100644 index 0000000..c783077 --- /dev/null +++ b/part/kxesyntaxhighlighter.cpp @@ -0,0 +1,257 @@ +/*************************************************************************** + kxesyntaxhighlighter.cpp - XML Syntax highlighter + ------------------- + begin : Ne pro 14 2003 + copyright : (C) 2003 by The KXMLEditor Team + email : lvanek.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kxesyntaxhighlighter.h" + +#include + +#include +#include +#include +#include + +#include + +// Regular expressions for parsing XML borrowed from: +// http://www.cs.sfu.ca/~cameron/REX.html + +KXESyntaxHighlighter::KXESyntaxHighlighter(QTextEdit *textEdit) + : QSyntaxHighlighter(textEdit) +{ + m_clrDefaultText.setRgb(0, 0, 0); + m_clrElementName.setRgb(128, 0, 0); + m_clrAttributeName.setRgb(0, 255, 255); + m_clrAttributeValue.setRgb(0, 255, 0); + m_clrXmlSyntaxChar.setRgb(0, 0, 128); + m_clrComment.setRgb(128, 128, 128); + m_clrSyntaxError.setRgb(255, 0, 0); +} + +KXESyntaxHighlighter::~KXESyntaxHighlighter() +{ +} + + +int KXESyntaxHighlighter::highlightParagraph(const QString& text, int endStateOfLastPara) +{ + //first I format the given line to default so any remaining highlighting is removed (Qt does not do it by itself) + setFormat(0 , text.length(), QColor(0, 0, 0)); + + int iBracketNesting = 0; + m_eParserState = parsingNone; + int pos; + unsigned int i = 0; + + if(endStateOfLastPara == 1) + { + QRegExp patternComment("[^-]*-([^-][^-]*-)*->"); // search end of comment + pos=patternComment.search(text, i); + + if(pos >= 0) // end comment found ? + { + int l = patternComment.matchedLength(); + + setFormat(0, l - 3, m_clrComment); + setFormat(l - 3, 3, m_clrXmlSyntaxChar ); + i += l; // skip comment + } + else + { + setFormat(0, text.length(), m_clrComment); + return 1; // return 1 to signify "in comment" + } + } + + for(; i < text.length() - 1; i++) + { + switch(text[i]) + { + case '<': + iBracketNesting++; + + if(iBracketNesting == 1) + { setFormat( i, 1, m_clrXmlSyntaxChar ); + m_eParserState = expectElementNameOrSlash; + } + else + setFormat( i, 1, m_clrSyntaxError ); // wrong bracket nesting + + break; + + case '>': + iBracketNesting--; + + if(iBracketNesting == 0) + setFormat( i, 1, m_clrXmlSyntaxChar ); + else + setFormat( i, 1, m_clrSyntaxError ); // wrong bracket nesting + + m_eParserState = parsingNone; + + break; + + case '/': + + if(m_eParserState == expectElementNameOrSlash) + { + m_eParserState = expectElementName; + setFormat( i, 1, m_clrXmlSyntaxChar ); + } + else + { + if(m_eParserState == expectAtttributeOrEndOfElement) + setFormat( i, 1, m_clrXmlSyntaxChar ); + else + processDefaultText(i, text); + } + + break; + + case '=': + if(m_eParserState == expectEqual) + { + m_eParserState = expectAttributeValue; + setFormat( i, 1, m_clrXmlSyntaxChar ); + } + else + { + processDefaultText(i, text); + } + break; + + case '\"': + + if(m_eParserState == expectAttributeValue) + { + QRegExp patternAttribute("\"[^<\"]*\"|'[^<']*'"); // search attribute value + pos=patternAttribute.search(text, i); + + if(pos == (int) i) // attribute value found ? + { + int l = patternAttribute.matchedLength(); + + setFormat(i, 1, m_clrXmlSyntaxChar ); + setFormat(i+1, l - 2, m_clrAttributeValue); + setFormat(i+l-1, 1, m_clrXmlSyntaxChar ); + + i += l - 1; // skip attribute value + m_eParserState = expectAtttributeOrEndOfElement; + } + else + processDefaultText(i, text); + } + else + processDefaultText(i, text); + + break; + + case '!': + if(m_eParserState == expectElementNameOrSlash) + { + QRegExp patternComment("